2015-07-23 2 views
0

У меня есть веб-сервис Java, который я собираюсь выполнить с нуля в Scala. У меня есть актерский дизайн для нового кода, в котором участвует около 10-20 актеров. Один из сценариев использования имеет поток, как это:Использование шины сообщений в качестве замены обычного сообщения, проходящего между участниками (например, в scala)

Актер A получает сообщение a, создает десятки b сообщений, которые будут обрабатываться Актером B (возможно, несколько экземпляров, для балансировки нагрузки), производя многократные c сообщения для актера C и так далее.

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

У меня есть следующие требования:

  1. сообщения не должны быть потеряны или повторяются. Я имею в виду, что если система перезапускается в середине обработки сообщений b, необработанные должны быть подняты после перезагрузки. С другой стороны, обработанные не должны быть приняты снова (эти сообщения в конце начнут некоторые большие вычисления, и повторение их будет дорогостоящим).
  2. Он должен быть легко расширяемым. Я имею в виду, что в будущем я могу добавить в систему некоторые другие компоненты, которые могут читать все сообщения (или их части) и, например, записывать журнал событий или подсчитывать, сколько сообщений было обработано, или сделать что-то новое с сообщениями b (рядом с тем, что уже происходит) и т. д. Обратите внимание, что эти «компоненты» могут быть независимыми приложениями, написанными на других языках.

Я новичок в сообщение шинных технологий, но и от того, что я читал, эти требования звучат для меня как то, что «автобусы сообщения» предложение, как RabbitMQ, Кафка, пустельги, но я также вижу, что AKKA также предлагает некоторые средства для настойчивости. Моя проблема заключается в том, что с учетом огромного диапазона возможностей я теряю технику использования. Я читал, что что-то вроде Кафки, вероятно, является излишним для моего заявления. Но я также не уверен, что настойчивость акки отвечает моим двум требованиям (особенно расширяемость).

Мой вопрос: должен ли я идти на корпоративный автобус сообщений? Что-то вроде Кафки? Или что-то вроде настойчивости акки? Или это будет быстрее и уместнее, если я что-то реализую сам (с поддержкой, скажем, AMQP, чтобы расширять возможности)?

Конечно, конкретные предложения по технологиям также приветствуются, если вы знаете что-то, что подходит для этой цели.

+0

Akka сам по себе поддерживает доставку _at-most-once_ (что означает, что сообщения могут быть потеряны).Если вы добавите в Акка Настойчивость, вы можете достичь доставки _at-minimum-once_ (что означает, что вы можете получить дубликаты), используя атрибут 'AtLeastOnceDelivery'. Тем не менее, вы хотите, чтобы сделать то, что вам нужно. Это не поддерживается Аккой из коробки, и есть те, кто говорит, что это невозможно. См. Например https://dzone.com/articles/you-cannot-have-exactly-once. Однако вы можете приблизиться, но для этого вам нужно работать. –

+0

Спасибо @MarioCamou за ваш комментарий. На самом деле, я видел этот пост. Итак, я должен принять ваше предложение как «построить его самостоятельно»? – Mahdi

+0

Да, я бы лично начал с по крайней мере-раз доставки, а затем имел дело с повторениями и сообщениями не по порядку. Обратите внимание, что даже если вы используете Kafka или очередь сообщений, вы должны учитывать тот факт, что сама очередь сообщений может опуститься (и с помощью Akka Persistence вам также нужно подумать о том, что, если ваш провайдер настойчивости опустится). –

ответ

0

Автобус сообщений (обычно называемый Message Brokers), такой как RabbitMQ, может обрабатывать «из коробки» все механизмы обмена сообщениями, которые вы описываете в своем вопросе. В частности:

RabbitMQ имеет возможность «из коробки»:

  • Для доставки сообщений без повторения сообщения.
  • Чтобы расширить систему и добавить журнал и получить статистику, как вы описываете.
+0

Спасибо за ваш ответ @ joshuad2. Вопрос в том, насколько это накладные расходы? Я имею в виду, учитывая, что моя система не очень крупная, вы бы рекомендовали использовать что-то вроде RabbitMQ? Например, учитывая затраты на обслуживание и администрирование. – Mahdi

+0

RabbitMQ очень легкий вес по сравнению с другими Message Brokers, такими как Kafka. Размер исполняемого файла довольно мал, и он будет использовать только то, что вы положили в Брокер. Поэтому, если у вас не так много сообщений в очередях в любой момент времени, размер и накладные расходы довольно малы, но преимущества высоки, учитывая ваши потребности в маршрутизации. – joshuad2

+0

OK. Я принимаю ваш ответ, хотя это обязательно займет время, пока я не смогу реально его реализовать и проверить! ;-) – Mahdi

Смежные вопросы