Saya telah mencoba memastikan bahwa konsumen dalam antrian (dengan pengelompokan pesan) hanya akan menerima satu pesan pada satu waktu dari setiap antrian yang ditanganinya, sampai konsumen mengakui pesan tersebut.

Untuk pengujian saya telah menyiapkan ActiveMQ Artemis dan memiliki 3 konsumen di wildcard EXAMPLE.* , dan satu penerbit memposting 10 pesan ke masing-masing dari 5 antrian: EXAMPLE.1 - EXAMPLE.5 . Apa yang saya lihat adalah bahwa setiap konsumen menerima pesan dari antrian dengan segera. Saya sudah mencoba menggunakan pengaturan ukuran jendela konsumen (sebagai 0) karena saya pikir itu akan membantu saya hanya mengirimkan satu pesan pada satu waktu dari setiap antrian, tetapi itu sepertinya tidak berhasil.

Apakah saya salah memahami pengaturan itu? Jika demikian, apakah ada pengaturan lain yang harus saya perhatikan untuk membantu saya agar ini berfungsi?

Kasus penggunaan khusus yang saya coba capai adalah bahwa saya mungkin akan memiliki banyak antrian dan beberapa konsumen. Dan penting bahwa pesan di setiap antrian ditangani secara berurutan, tetapi semua antrian dapat ditangani secara paralel.

Terima kasih!

0
Gen Hart 2 Juli 2020, 19:32

1 menjawab

Jawaban Terbaik

Pengelompokan pesan yang didukung oleh ActiveMQ Artemis memungkinkan untuk mendapatkan semua pesan dari grup yang sama yang diproses secara serial oleh konsumen yang sama. Jika semua pesan antrian memiliki id grup yang sama, mereka akan diproses secara serial oleh konsumen yang sama.

Namun pesan yang dikelompokkan dapat memengaruhi pemrosesan bersamaan. Misalnya, jika ada potongan 100 pesan dari grup yang terkait dengan klien di kepala antrian diikuti oleh pesan lain dari grup yang terkait dengan klien lain, maka 100 pesan pertama harus dikirim ke klien yang sesuai. (yang menggunakan pesan-pesan yang dikelompokkan tersebut secara serial) sebelum pesan lain dapat digunakan.

Ukuran jendela konsumen hanya mempengaruhi pesan buffer konsumen dari server. Jika ukuran jendela konsumen diatur ke 0 maka konsumen tidak menyangga pesan apa pun, sehingga pesan dapat dikirimkan ke konsumen lain.

Dalam kasus Anda, produsen dapat menggunakan nama antrian untuk mengatur id grup sehingga konsumen EXAMPLE.* akan memproses pesan setiap antrian secara berurutan tetapi saya tidak akan mengatur ukuran jendela konsumen ke 0 karena dapat membatasi paralelisme konsumen.

Demo pengelompokan pesan berikut dalam hierarki topik dengan ukuran jendela konsumen sama dengan 0 menunjukkan pesan yang dikonsumsi secara berurutan dari setiap antrian dan paralelisme terbatas di antara konsumen.

public static void main(final String[] args) throws Exception {
   Connection connection = null;
   try {
      ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory();
      cf.setConsumerWindowSize(1);
      connection = cf.createConnection();
      Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

      Topic topicSubscribe = ActiveMQJMSClient.createTopic("EXAMPLE.*");

      MessageConsumer[] messageConsumers = new MessageConsumer[] {
         session.createSharedConsumer(topicSubscribe, "EXAMPLE"),
         session.createSharedConsumer(topicSubscribe, "EXAMPLE"),
         session.createSharedConsumer(topicSubscribe, "EXAMPLE")
      };

      MessageProducer producer = session.createProducer(null);

      for (int i = 0; i < 10; i++) {
         for (int t = 0; t < 5; t++) {
            TextMessage groupMessage = session.createTextMessage("Group-" + t + " message " + i);
            groupMessage.setStringProperty("JMSXGroupID", "Group-" + t);
            producer.send(ActiveMQJMSClient.createTopic("EXAMPLE." + t), groupMessage);
         }
      }

      connection.start();

      TextMessage messageReceived;
      for (int i = 0; i < 100; i++) {
         for (int c = 0; c < 3; c++) {
            while ((messageReceived = (TextMessage) messageConsumers[c].receive(500)) != null) {
               System.out.println("Consumer" + c + " received message: " + messageReceived.getText());
            }
            System.out.println("Consumer" + c + " received message: null");
         }
      }
   } finally {
      // Step 12. Be sure to close our resources!
      if (connection != null) {
         connection.close();
      }
   }
}

Keluaran dari demonya adalah:

Consumer0 received message: Group-0 message 0
Consumer0 received message: Group-3 message 0
Consumer0 received message: Group-4 message 0
Consumer0 received message: Group-0 message 1
Consumer0 received message: null
Consumer1 received message: Group-1 message 0
Consumer1 received message: Group-1 message 1
Consumer1 received message: null
Consumer2 received message: Group-2 message 0
Consumer2 received message: Group-2 message 1
Consumer2 received message: null
Consumer0 received message: Group-3 message 1
Consumer0 received message: Group-4 message 1
Consumer0 received message: Group-0 message 2
Consumer0 received message: Group-3 message 2
Consumer0 received message: Group-4 message 2
Consumer0 received message: Group-0 message 3
Consumer0 received message: null
Consumer1 received message: Group-1 message 2
Consumer1 received message: Group-1 message 3
Consumer1 received message: null
Consumer2 received message: Group-2 message 2
Consumer2 received message: Group-2 message 3
Consumer2 received message: null
...
0
Domenico Francesco Bruscino 2 Juli 2020, 21:37