Погуглив, как сообщение отправляется/получается в мессенджере, таком как WhatsApp, я обнаружил, что они используют систему обмена сообщениями на основе очередей. Я просто пытаюсь понять, что может быть высокоуровневым дизайном этой функции.
HLD, насколько я понимаю:- Допустим, друг 1 и друг 2 находятся в сети. Друг 1 установил веб-соединение HTTP с веб-сервером 1, а друг 2 установил веб-соединение HTTP с веб-сервером 2. Друг 1 отправил сообщение другу 2.
Теперь, как только сообщение приходит на веб-сервер 1, мне нужно передать сообщение на веб-сервер 2, чтобы сообщение можно было отправить другу 2 через уже установленное веб-соединение.
Я считаю, что здесь можно использовать распределенные пользовательские очереди Java для распространения сообщения с одного сервера на другой. Как только сообщение поступает на один сервер, оно помещается в распределенную очередь (распределенная очередь из-за балансировки нагрузки и высокой доступности) с содержимым сообщения, fromUserId, toUserId. В очереди будет слушатель, который увидит идентификатор пользователя только что появившегося сообщения и найдет, на каком веб-сервере идентификатор пользователя является активным. Если пользователь активен, выведите сообщение и отправьте его клиенту, в противном случае сохраните его в БД, чтобы его можно было извлечь после подключения к сети. Чтобы увидеть, какой пользователь активен на каком сервере, мы можем поддерживать древовидную карту с идентификатором пользователя в качестве ключа и значением в качестве имени сервера для эффективного поиска.
Вероятно, фактический дизайн должен быть более сложным/масштабируемым, чем описанный выше. Хотите знать, правильное ли это направление для масштабируемого чат-мессенджера?
Также я считаю, что нам нужно иметь несколько распределенных очередей вместо одной для такого масштабируемого приложения. Но если у нас есть несколько распределенных очередей, как система обеспечит доставку сообщений FIFO по распределенным очередям?