MessageBroker library provides message broker implementation. It allows creating custom listeners, subscribing them to topics and receiving messages from topics they are subscribed to. If application breaks in the middle of broadcast, when broker starts functioning again, it will continue delivering messages it had in queue before it broke.
- run "mvn package" from root
- get target/message_broker-1.0-SNAPSHOT-jar-with-dependencies.jar file and add it as external library to your project
MessageBroker broker = new Broker();
public class CustomListener implements Listener {
@Override
public void onReceive(Message message) {
//put your code here
}
...
}
public class CustomMessage extends Message {
public CustomMessage(String text) {
super(text);
}
}
// create your topic
String topic = "topic";
// subscribe
Listener listener = new CustomListener();
broker.subscribe(listener, topic)
// publish
broker.publish(new CustomMessage("Hello, world!"), topic);
// unsubscribe
broker.unsubscribe(listener, topic)
broker.close();
В итоговом варианте брокера в бд сохраняются только задачи на рассылку, так как хранение тем и листенеров представляется нецелесообразным при отсутствии сетевого взаимодействия (Если JVM упадет, то упадет и клиент). Рассылка реализована многопоточно, запись задач в базу тоже в отдельном потоке. Написание логики получения сообщения в листенере предоставляется клиенту.
- Масштабируемость:
- Размер сообщений: кешировать часто повторяемые сообщения, передавать не сообщение, а его id.
- Количество сообщений: отсылать за раз пакет из нескольких сообщений, если не критично получение в real-time
- Количество тем: добавить параллельность на уровне отправки сообщений (сейчас одна тема - один поток)
- Для возможности сетевого соединения можно реализовать сетевое взаимодействие вида "одна нода - сервер, куда приходят сообщения в очередь, все шлют сообщения на него, он шлет пачки сообщений на другие ноды, ответственные за рассылку на определенных листенеров"
- Для сохранения данных при падении сервера необходимо реализовать резервное копирование информации между серверами