Напишу здесь другой ответ. Основано на моем опыте общения в чате. Вам нужен только один топи c на все сообщения. Использование хорошо продуманного тела Message
.
public class Message {
private String from; // user id
private String to; // user id or group id
}
Затем вы можете создать около 100 разделов для этого topi c и создать двух потребителей для их потребления (50 разделов для одного потребителя в начале). Затем, если ваша система достигнет узкого места, вы сможете легче масштабировать X дополнительных потребителей, чтобы справиться с нагрузкой.
Как распределить сообщения среди потребителей. Раньше я отправлял сообщения в мобильное приложение, поэтому все приложение имеет давно существующее соединение с сервером, и сервер отправляет сообщения в приложение по этому каналу. Для группового чата я создаю кеш Redis для хранения всех активных пользователей в группе, чтобы мне было проще получить пользователей, которые принадлежат к этой группе, и отправить им сообщения.
И еще одна вещь, Kafka без сохранения состояния, означает, что Kafka не отключается от бизнес-логики c, только действует как система сообщений, передает сообщения. Если вы подключите свой бизнес-лог c к Kafka, например, создадите топи c «One-to-One» и удалите некоторые после их завершения, Kafka будет очень беспорядочным.