Я строю проект с нуля, используя event-sourcing с Java и Cassandra. Мои приложения, основанные на микросервисах, и в некоторых случаях информация будет обрабатываться асинхронно. Мне было интересно, какая часть очереди сообщений (например, Rabbit, Active MQ Artemis, Kafka и т. Д.) Будет играть, чтобы улучшить технологический стек в этой среде, и если я пойму сценарии, если не буду использовать его.Event-sourcing: когда (и не) следует использовать очередь сообщений?
ответ
Убедитесь, что вы четко разбираетесь в различии между отправкой (командой) и публикацией (событием). Уди Дахан затрагивает эту тему в своем эссе по адресу busses and brokers.
В большинстве случаев, когда вы являетесь источником событий, вы делаете не хотите восстановить состояние из опубликованных событий. Если вам нужно состояние, затем запросите технический орган/книгу записей для истории и восстановите состояние из истории.
С другой стороны, событие приведено в действие Активность в очереди сообщений должна быть прекрасной. Когда одно событие (плюс состояние абонента) имеет все, что вам нужно, тогда отключение шины в порядке.
В некоторых случаях вы можете сделать то и другое. Например, если вы обновляли кешированные представления, вы подписались на различные события BobChanged
, чтобы узнать, когда ваши данные в кеше были устаревшими; чтобы восстановить устаревший вид, вы перезагрузите представление истории и преобразуете его в обновленное представление.
В мире приложений для поиска событий очереди сообщений обычно позволяют реализовать стиль публикации-подписания шаблона связи между производителями и потребителями. Кроме того, они обычно помогают вам с гарантиями доставки: какие сообщения были доставлены абонентам, а какие нет.
Но они не сохраняют все сообщения на неопределенный срок. У вас должен быть магазин событий для любого источника событий.
вопрос не является «стоять в очереди или не стоять в очереди», но это больше похоже на:
- может эта вещь магазин огромный объем событий на неопределенный срок?
- У этого есть возможности публикации-подписки?
- Предоставляет ли гарантия доставки по крайней мере один раз?
Таким образом, вы должны использовать что-то вроде Kafka или EventStore иметь все то, что вне коробки. Кроме того, вы можете комбинировать хранилище событий с очередью сообщений вручную, но это будет более активно.
Я бы начал с разделения инфраструктуры обмена сообщениями, такой как RabbitMQ, с потоковой передачи/хранения/обработки событий, таких как Kafka. Это две разные вещи, сделанные для двух (или более) разных целей.
Что касается источника событий, у вас должно быть место, где вы должны хранить события. Это хранилище должно быть только append и поддерживать быстрое считывание неструктурированных данных на основе идентичности. Одним из примеров такого сохранения является EventStore.
Event sourcing идет вместе с CQRS, что означает, что вы должны проектировать свои изменения (события) в другой магазин, который вы можете запросить. Это делается путем проецирования событий в это хранилище, где события обрабатываются для изменения состояния объекта домена.Важно понимать, что использование инфраструктуры сообщений для прогнозов, как правило, является плохой идеей. Это связано с характером обмена сообщениями и двухфазной фиксацией.
Если вы посмотрите, как события сохраняются, вы можете увидеть, что они сохраняются в магазине как одна транзакция. Если вам нужно будет публиковать события, это будет другая транзакция. Поскольку вы делитесь двумя различными областями инфраструктуры, все может сломаться.
Проблема с сообщениями как таковая заключается в том, что сообщения, как правило, гарантируют доставку «по крайней мере один раз», и порядок сообщений обычно не гарантируется. Кроме того, когда ваш пользователь сообщения терпит неудачу и NACK передает сообщение, он будет повторно установлен, но обычно бит позже, снова нарушая последовательность.
Проблемы с упорядочением и дублированием, кто бы то ни было, не применяются к серверам потоковой передачи событий, таким как Kafka. Кроме того, EventStore гарантирует возможность доставки только событий только в том случае, если вы используете догоняющую подписку.
По моему опыту, сообщения используются для отправки команд и реализации управляемой событиями архитектуры для подключения независимых служб реактивным способом. Хранилища событий, с другой стороны, используются для сохранения событий, и только события, которые попадают туда, затем проецируются в хранилище запросов, а также публикуются на шине сообщений.
- 1. Когда следует использовать * и когда &?
- 2. Когда следует использовать Контракты сообщений вместо DataContract и почему?
- 3. APNS и очередь сообщений
- 4. Когда следует использовать memcpy и когда следует использовать memmove?
- 5. Когда следует использовать make_heap и Priority Queue?
- 6. Когда не следует использовать IDisposable?
- 7. Когда следует использовать ViewModels Services и Isolatedstorage
- 8. Когда следует использовать setUpClass и когда __init__?
- 9. Когда следует использовать aov() и когда anova()?
- 10. Когда следует использовать logInfo и когда writeln?
- 11. Какая очередь сообщений для сообщений пользователя
- 12. Когда следует использовать каждый из разных типов сообщений для Android?
- 13. Очередь сообщений, когда Интернет недоступен в XMPP
- 14. Когда следует использовать didFinishLaunchingWithOptions?
- 15. очередь сообщений Design
- 16. Когда следует использовать Flask.g?
- 17. Как использовать очередь сообщений в веб-сканере?
- 18. Когда HttpWebRequest.Credentials следует использовать
- 19. Когда следует использовать Datomic?
- 20. Когда следует использовать Task.Run()?
- 21. Когда следует использовать «новое»?
- 22. очередь сообщений: выбор и калибровка
- 23. Когда следует использовать getElementById?
- 24. Когда следует использовать XPath?
- 25. Когда следует использовать помощников?
- 26. Очередь сообщений в PHP
- 27. Когда следует использовать cfthread?
- 28. Когда следует использовать параметры?
- 29. Когда следует использовать SecureZeroMemory()?
- 30. Когда следует использовать curl_close()?
Спасибо, Алексей, быстрый вопрос здесь: как это относится к вопросу о заказе и дублировании, кто бы не применялся к серверам потоковой передачи событий, таким как Кафка? Если у вас есть одновременные подписчики, вы неизбежно начинаете нарушать порядок, если эти параллельные подписчики взаимозависимы, поэтому между ними должна быть реализована некоторая пользовательская синхронизация на основе бизнес-правил конкретного приложения. Правильно ли я понимаю? – IlliakaillI
У меня лично нет опыта работы с Kafka, но я смотрел разговор о Мартине Клепмманне на DDDU 2016 https://dddeurope.com/2016/martin-kleppmann.html, где он объясняет, что, когда они разрабатывали Kafka, они стремились к строгому упорядочению событий. Я также знаю, что EventStore гарантирует порядок событий при использовании подписки catch/up. Неизбежно эта гарантия ломается, когда вы устанавливаете конкурирующих потребителей в потоках событий, вы ничего не можете сделать, чтобы гарантировать заказ. Асинхронная обработка также нарушит порядок. –
Я вижу. Я спрашиваю, потому что в любой системе HA у вас должны быть конкурирующие пользователи для отказоустойчивости, и похоже, что нет механизма автоматического устранения ситуаций не в порядке для таких систем. – IlliakaillI