/ / ActiveMQ Съобщение на потребителя за група потребители в множество опашки? - java, jms, activemq, съобщение-опашка, мамо

ActiveMQ Message Group Потребителска селекция в множество опашки? - java, jms, activemq, опашка за съобщения, мама

Групи съобщения ActiveMQ ■ площ чудесен функция за балансиране на натоварването в множествопотребителите. Накратко: поток от съобщения е разделен на множество потребители от една опашка според идентификатор на група, вграден в съобщението (JMSXGroupID). (Така че потребителят 1 ще получи всички съобщения с JMSXGroupID = a, потребителят 2 ще получи всички съобщения с JMSXGroupID = b, и така нататък.)

Сега си представете, че имате две опашки: A и Bи си представете, че една последователна таксономия на JMSXGroupIDs се използва в съобщения, преминаващи през двете опашки. Ще потребителят, когото брокерът избира JMSXGroupID = ABC на опашка A да бъде потребителят от същата връзка, за която е избрал брокерът JMSXGroupID = ABC на опашка B?

Подозирам, че отговорът на въпроса, който съм поискал, е "не." A няма съответстващ потребител за B? Какво се случва, ако потребителят, който брокерът избере A има многократни съответните потребители B? В тези случаи няма очевиден правилен отговор.

Можем ли обаче да симулираме това поведение? Например, потребител на композитна дестинация може да бъде жизнеспособно решение - уверете се, че всички потребители са на A и B консумират на композитната дестинация A,B и може да сте в бизнес - но ActiveMQ не изглежда да поддържа консумация от съставни дестинации.

Единственото решение, което намерих, е просто да натрапвам съобщения и за двете A и B на една единствена опашка - обадете се AB - и да имат изключителен потребител за това. Сега трябва да правите разлика между "A съобщения "и"B съобщения, "но лесно можете да направите това с хедъри.

Това решение обаче мирише смешно. (Сега трябва да приемете, че производителите ще приложат специални заглавия към своите съобщения или ще променят полезния си товар.) Има ли решение, което ще гарантира, че потребителите ще се свържат в две отделни опашки A и B винаги се приземявам на една и съща връзка?

Отговори:

1 за отговор № 1

Както правилно сте разработили, групите съобщения се отнасят само за една опашка. Няма координация между няколко опашки.

Обикновено, когато използвате групи съобщения, виесе опитват да гарантират поръчка на съобщения не само при доставка, но и при обработка - така че всички събития за даден обект се обработват последователно. Дяволът винаги е в детайлите на вашия случай на използване, но поставянето на всички свързани съобщения в една опашка ще ви даде резултата, който искате. За да ги обработвате по различен начин, тогава трябва да сложите някаква мултиплексираща логика в своя потребител, за да вземете решение, базирано на полезния товар на съобщението - добре познат заглавието, както казвате, е добър кандидат за решение.

За да преодолеете предпоставката да се гарантира, че клиентите изрично задават това, можете да напишете част от логиката на Camel routing, която прави това от ваше име - това е възможно само с брокер: компонент който е добавен към ActiveMQ 5.9. Идеята е производителите да видят две отделни опашки - A & B; логиката на маршрутизацията ще се чете от тези опашки, когато съобщенията се въвеждат, задават съответно заглавката и ги пренасочват към C вместо, Логиката за маршрутизация действа като прехващач.

<route id="ConflateA">
<from uri="broker:queue:A"/>
<setHeader headerName="OriginalMessageSource">
<constant>A</constant>
</setHeader>
<to uri="broker:queue:C"/>
</route>

След това можете да използвате OriginalMessageSource заглавието в логиката на мултиплексиране.