Обеспечение упорядоченной обработки сообщений - PullRequest
1 голос
/ 25 июня 2019

Таким образом, у меня есть ситуация с микросервисной архитектурой, где я должен гарантировать, что входящие сообщения, имеющие общий идентификатор, будут обрабатываться в порядке их поступления от kafka:

      message2, message1 kafka
     ------------------------------
             |message1       |message2
             |               |
         Instace1         Instance2

В приведенном ниже примере я имеюдва экземпляра службы, которые обрабатывают сообщения от kafka, но я хочу убедиться, что message2 обрабатывается только после message1.

По-видимому, эту ситуацию легко решить, настроив один экземпляр для потребления только отконкретный раздел, который будет хранить сообщения с общим неопределителем:

message2, message1 kafka
--------------------------------
       | message2
       | message1
     Instance1        Instance2

Теперь порядок гарантирован, и message2 никогда не будет обработан до message1.

Однако я былХотите знать, можно ли решить эту проблему другим способом, прямо в коде, а не полагаться на инфраструктуру?Похоже, что это может быть стандартной проблемой в микросервисной архитектуре, но я не уверен, что было бы предпочтительным подходом для ее решения?

Ответы [ 3 ]

1 голос
/ 25 июня 2019

Я бы предложил инфраструктуру в качестве более «правильного» пути, но решение этого с помощью кода должно быть возможным:

Если у вас есть один производитель сообщений, прикрепите к сообщению идентификаторнепосредственно предшествующее сообщение и прежде чем использовать сообщение, убедитесь, что вы использовали предшествующее непосредственно ранее.

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

Опять же, я предлагаю, чтобы инфраструктура была более "правильным" способом решения этой проблемы (чем меньше кода вы пишете и чем менее сложным, тем меньше ошибок вы будете иметь).

1 голос
/ 25 июня 2019

Kafka гарантирует только заказ внутри раздела .

Таким образом, если вы хотите, чтобы «message1» обрабатывалось до «message2», вам нужно убедиться, что оба сообщения попадают в один и тот же раздел. Тогда любой потребитель, читающий эти сообщения, гарантированно увидит их в том порядке, в котором они были созданы.

0 голосов
/ 25 июня 2019

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

Таким образом, каждый потребитель ожидает, пока все сообщения, предшествующие текущему сообщению, будут использованы, а затем начинает использовать сообщение, чтобы сохранить порядок сообщений.

Но это решение добавляет сложности к коду, а также каково преимущество использования более чем одного потребителя в этом случае? В лучшем случае нет разницы, в случае производительности, между использованием 1 потребителя или 10 потребителей, если вы хотите сохранить заказ или сообщения, потому что потребители должны ждать, пока предыдущие сообщения не поступят.

...