2016-01-31 3 views
1

Мне не удалось найти ответ на этот вопрос в документации Akka.Akka Распространяемая публикация Подписать гарантии

Я знаю, что два сообщения, опубликованные в той же теме в последовательности, гарантированно поступят в том же/правильном порядке. Если я опубликую два сообщения по двум различным темам - они также гарантированно поступят в правильном порядке? Если нет, то какие парадигмы я могу использовать для обеспечения этого? Примечание. Есть очень веская причина, по которой я не публикую эти сообщения в той же теме.

Благодарим за помощь.

ответ

2

Я должен предупредить, что это в меру моего понимания. Похоже, что темы в Distributed Pub Sub выпекаются актерами. Каждая тема содержит список подписчиков. Доставка сообщений в паб sub будет следовать тем же гарантиям доставки и заказа между любыми парами участников.

Я хотел бы обратиться к первому комментарию, что сообщения, отправленные/опубликованные на ту же тему, гарантированно будут доставлены в том же порядке, который они отправили. Это справедливо только для одного абонента. В этом случае тема является актером, а подписчиком является другой актер. поэтому сообщения будут доставлены в порядке (если вообще). Однако, если у меня есть два подписчика (S1 и S2) по той же теме, и я публикую сообщения A и B по той же теме, вполне возможно, что оба B (и A) будут доставлены на S1 до того, как A будет доставлен в S2.

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

Кроме того, независимо от одной темы или двух тем, для вашего случая использования, вам может потребоваться подумать о других проблемах, таких как необходимость как минимум семантики обмена сообщениями. Причина в том, что даже с одной темой я не могу гарантировать, что первое сообщение в теме будет передано до второго. Я могу гарантировать, что если первое сообщение и второе сообщение будут доставлены (не потеряны), то первый будет поступать до второго. Но первый не может быть доставлен вообще, а второй может появиться без подписчика, который видит первый. Это выполняется для отправки сообщений на ту же тему, а также на разные темы.

Если вы действительно нуждаетесь в этом вам может понадобиться, чтобы оценить что-то вроде надежного прокси-шаблон: http://doc.akka.io/docs/akka/current/contrib/reliable-proxy.html

Обратная связь от других членов приветствовать ...

+0

Спасибо за очистку, что до, высоко ценится. – JoeC

+0

Спасибо, что разъяснил Майклу! так, если у вас есть только один издатель и несколько удаленных подписчиков (т. Е. Мастер со многими «подчиненными», которые выполняют задание, то есть идемпотент, т. Е. Если вы повторяете одно и то же несколько раз, это не эффективно, но все в порядке), тогда можно просто иметь издателя или актера, который общается с ним, как PersistentActor, когда заканчивается длинная работа, рабочий отправляет сообщение назад, а постоянный актер отмечает его как доставленный. Если он не получит это сообщение за X секунд, он снова отправит его: таким образом мы закончим, по крайней мере, одно задание, верно? –