Pengantar RabbitMQ

1. Ikhtisar

Pemisahan komponen perangkat lunak adalah salah satu bagian terpenting dari desain perangkat lunak. Salah satu cara untuk mencapainya adalah dengan menggunakan sistem pesan, yang menyediakan cara komunikasi asinkron antar komponen (layanan). Pada artikel ini, kami akan membahas salah satu sistem tersebut: RabbitMQ.

RabbitMQ adalah perantara pesan yang menerapkan Advanced Message Queuing Protocol (AMQP). Ini menyediakan perpustakaan klien untuk bahasa pemrograman utama.

Selain digunakan untuk decoupling komponen perangkat lunak, RabbitMQ dapat digunakan untuk:

  • Melakukan operasi latar belakang
  • Melakukan operasi asinkron

2. Model Pesan

Pertama, mari kita lihat cepat, tingkat tinggi tentang cara kerja perpesanan.

Sederhananya, ada dua jenis aplikasi yang berinteraksi dengan sistem pesan: produsen dan konsumen. Produsen adalah mereka yang mengirim (menerbitkan) pesan ke broker, dan konsumen, yang menerima pesan dari broker. Biasanya, program ini (komponen perangkat lunak) berjalan pada mesin yang berbeda dan RabbitMQ bertindak sebagai middleware komunikasi di antara mereka.

Pada artikel ini, kita akan membahas contoh sederhana dengan dua layanan yang akan berkomunikasi menggunakan RabbitMQ. Salah satu layanan akan mempublikasikan pesan ke RabbitMQ dan yang lainnya akan mengkonsumsi.

3. Penyiapan

Untuk permulaan, mari jalankan RabbitMQ menggunakan panduan pengaturan resmi di sini.

Kami secara alami akan menggunakan klien Java untuk berinteraksi dengan server RabbitMQ; ketergantungan Maven untuk klien ini adalah:

 com.rabbitmq amqp-client 4.0.0 

Setelah menjalankan broker RabbitMQ menggunakan panduan resmi, kita perlu menghubungkannya menggunakan klien java:

ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); 

Kami menggunakan ConnectionFactory untuk mengatur koneksi dengan server, itu menangani protokol (AMQP) dan otentikasi juga. Di sini kita terhubung ke server di localhost , kita dapat mengubah nama host dengan menggunakan fungsi setHost .

Kita dapat menggunakan setPort untuk mengatur port jika port default tidak digunakan oleh RabbitMQ Server; port default untuk RabbitMQ adalah 15672 :

factory.setPort(15678);

Kami dapat mengatur nama pengguna dan kata sandi:

factory.setUsername("user1"); factory.setPassword("MyPassword");

Selanjutnya, kami akan menggunakan koneksi ini untuk menerbitkan dan mengonsumsi pesan.

4. Produser

Pertimbangkan skenario sederhana di mana aplikasi web memungkinkan pengguna menambahkan produk baru ke situs web. Setiap kali produk baru ditambahkan, kami perlu mengirim email ke pelanggan.

Pertama, mari tentukan antrian:

channel.queueDeclare("products_queue", false, false, false, null);

Setiap kali pengguna menambahkan produk baru, kami akan menerbitkan pesan ke antrian:

String message = "product details"; channel.basicPublish("", "products_queue", null, message.getBytes());

Terakhir, kami menutup saluran dan koneksi:

channel.close(); connection.close();

Pesan ini akan dikonsumsi oleh layanan lain, yang bertanggung jawab untuk mengirim email ke pelanggan.

5. Konsumen

Mari kita lihat apa yang bisa kita terapkan dari sisi konsumen; kami akan mendeklarasikan antrian yang sama:

channel.queueDeclare("products_queue", false, false, false, null);

Berikut cara kami mendefinisikan konsumen yang akan memproses pesan dari antrian secara asinkron:

DefaultConsumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery( String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); // process the message } }; channel.basicConsume("products_queue", true, consumer);

6. Kesimpulan

Artikel sederhana ini membahas konsep dasar RabbitMQ dan membahas contoh sederhana penggunaannya.

Implementasi lengkap dari tutorial ini dapat ditemukan di proyek GitHub.