#database #apache-kafka #websocket #rabbitmq
Вопрос:
мы создаем приложение с системой чата в рамках нашего сервиса, для этого мы используем веб-сайты, так как он легко доступен на всех платформах(ios,android,web).
Но нам нужно сохранить все сообщения, полученные с веб-сайтов.
Мы поняли, что веб-сайты чрезвычайно быстры, поэтому, если запустить запрос, для каждого сообщения, которое мы получили через веб-сайты, может быть
некоторые шансы, что некоторые сообщения не будут сохранены/или могут быть потеряны.
позвольте мне объяснить это:
Случай1
поэтому в чате один на один, когда мы получаем сообщение, мы сохраняем его в переменной с именем $msg
и просто передаем его $msg
предполагаемому пользователю. Так, если добавить больше логики, как, прежде чем отправить сообщение пользователю, то мог бы запустить запрос, чтобы сохранить сообщение, потребуется определенное время, допустим 2 сек или 1 сек, с такой логикой, некоторые сообщения, полученные через сокеты будут потеряны, поэтому мы должны доставить сообщение, как только мы получили.
Случай 2
может быть и другая логика; если мы запустим запрос после отправки сообщения предполагаемому пользователю, за это время может возникнуть вероятность $msg
того, что переменная изменила свое значение так много раз, всего за долю секунды.
давайте рассмотрим пример.
предположим, что переменная $msg
имеет «привет» и мы передаем эту $msg
переменную в функцию, которая сохраняет сообщение в базе данных, но, как мы знаем, WebSockets являются чрезвычайно быстро, там может быть шанс, значение, хранящееся в $МСГ был изменен много раз, и мы потеряли наше сообщение «Привет», которое мы хотим сохранить.
можем ли мы реализовать очередь сообщений(ОЧЕРЕДЬ СООБЩЕНИЙ DS) в этом случае, или нам следует использовать службы apache kafka, подобные rabbitmq ?
Примечание: мы уже знакомы с некоторыми концепциями баз данных в реальном времени, предоставляемыми технологическими гигантами, но из-за их высокой стоимости мы не можем использовать такого рода услуги.
Комментарии:
1. Что именно вы подразумеваете под «высокой стоимостью»? Множество баз данных с открытым исходным кодом поддерживают высокую пропускную способность чтения/записи. «Стоимость» администратора сервера для любой базы данных/очереди сообщений или ее обучения также будет высокой, и вам следует взвесить это с оплатой размещенной службы
2. если вы отправляете функцию обратного вызова при каждом получении websocket, изменить $msg невозможно, так как он находится в другой области памяти. как это меняется?