Проблема выбора потребителя в activeMQ

Сценарий: я отправляю пятьдесят тысяч сообщений в очередь с именем JUST.CN. И установка одного сообщения propertyString "myfilter = 'abc'" каждые 1000 сообщений. Теперь я создаю потребителя с тем же селектором для потребления сообщений. Однако скорость потребления очень низкая, особенно после 30000 сообщений. Я не могу изменить конфигурацию по умолчанию в activeMQ. Основной код ниже:

 IDestination destination = SessionUtil.GetDestination(session, "JUST.CN");
                    IMessageProducer producer = session.CreateProducer(destination);
                    string msg = "Hello hello hello world!~~testing~Hello hello hello world!~~testing~";

                    for (int i = 0; i < 50000; i++)
                    {
                        ITextMessage message;

                        if (i % 1000 == 0)
                        {
                            message = session.CreateTextMessage(msg);
                            message.Properties.SetString("myfilter", "abc");
                        }
                        else
                        {
                            message = session.CreateTextMessage(msg);
                        }
                        producer.Send(message, MsgDeliveryMode.Persistent, MsgPriority.Normal, TimeSpan.MinValue);
                    }

Код потребителя:

 IDestination destination = SessionUtil.GetDestination(session, "JUST.CN");             
 IMessageConsumer consumer = session.CreateConsumer(destination, "myfilter='abc'", false);

                    int count = 0;
                    DateTime dtstart = DateTime.Now;
                 for (int i = 0; i < 50; i++)
                    {
                        IMessage iMsg = consumer.Receive();
                        ITextMessage msg = (ITextMessage)iMsg;
                        Console.WriteLine(msg.Text);
                        count++;

                    }
                    DateTime dtend = DateTime.Now;
                    TimeSpan time = dtend - dtstart;
                    Console.WriteLine(time);
                    Console.WriteLine(count);

Есть ли какие-либо специальные настройки, которые мне нужно использовать для селекторов ActiveMQ? Заранее благодарим вас за любой вклад.


person Yolanda    schedule 10.01.2014    source источник


Ответы (1)


В общем, использование селекторов сообщений с очередями — это антишаблон. Есть хорошая статья о том, почему это произошло, в блоге несколько лет назад по адресу Ade on Middleware.

Если вы рассматриваете использование селекторов сообщений в очередях, вариант использования, как правило, заключается в том, что определенные потребители заинтересованы только в некоторых сообщениях. Вы можете решить этот вариант использования гораздо более удобным способом, используя составные места назначения, настроенные на брокер, применяющий фильтр (через filteredDestination), эквивалентный логике выбора:

<broker xmlns="http://activemq.apache.org/schema/core">
  <destinationInterceptors>
    <virtualDestinationInterceptor>
      <virtualDestinations>
        <compositeQueue name="myapp.in" forwardOnly="true">
          <forwardTo>
            <filteredDestination selector="myHeader > 5" queue="myapp.out.high"/>
            <filteredDestination selector="myHeader <= 5" queue="myapp.out.low"/>
          </forwardTo>
        </compositeQueue>
      </virtualDestinations>
    </virtualDestinationInterceptor>
  </destinationInterceptors>
</broker> 

Здесь происходит следующее: фильтр SQL92 запускается для сообщения, когда оно поступает в очередь myapp.in, и сообщения сортируются соответствующим образом. Подписчик, который хочет потреблять только самые высокие сообщения, подписывается на myapp.out.high.

Делая это, вы эффективно переворачиваете проблему с ног на голову и устраняете необходимость сложной обработки при использовании сообщений.

person Jakub Korab    schedule 13.01.2014
comment
Спасибо, Джейк. Ваш ответ мне очень помогает. Создание виртуального пункта назначения и отправка туда сообщения. Это приведет к большому количеству очередей. Есть ли другой способ сделать это с одной очередью? Возможно, это единственный способ создать одну очередь для каждого потребителя при отправке сообщения конкретному потребителю. В системе будет 1000 потребителей для связи PTP. Я не могу представить, что произойдет на сервере ActiveMQ. - person Yolanda; 15.01.2014
comment
В общем, нормально иметь много пунктов назначения у брокера. Однако может показаться, что вы используете неправильный набор функций (очереди могут быть не лучшим способом решения вашей конкретной проблемы). Если вы можете сказать, чего вы пытаетесь достичь, я мог бы указать вам правильное направление. - person Jakub Korab; 16.01.2014
comment
В нашей системе будет около 1000 пользователей. Я хочу реализовать двухточечную связь между собой (возможно, одновременно в сети может быть около 300 пользователей). И сообщение будет постоянно храниться в брокере activemq. .Например, пользователь А отправляет одно сообщение пользователю Б. userB получит сообщение один раз в сети. И один пользователь будет иметь три типа клиентской стороны, такие как клиент WebPage, Instant Communication Tool и Mobile. Это означает, что одно сообщение будет отправлено на все клиентские стороны useB.Is Есть ли хороший способ добиться этого? Спасибо, Джейк. - person Yolanda; 16.01.2014
comment
Одно и то же сообщение каждый раз отправляется на все 3 адресата? - person Jakub Korab; 16.01.2014