我在一家公司工作,该公司有一个移动的应用程序,用户可以与公司进行互动。
该应用程序是在React原生
后端是laravel
问题:老板想要在应用中实现通知系统。目前,当用户收到私人消息时,firebase会触发推送通知。但是,应用程序中没有内部“通知概览屏幕”。我必须开发这个。
一些要求:
- 当用户在讨论中得到答案时,它应该触发“有人回答了您的问题”的通知。当其他人回答时,不应该有第二次通知,但第一次通知应该更新为“2人回答了您的问题”。带有一些元数据,如用户名和最后一个评论者的个人资料图片。
- 它应该是“真实的”的。因此,当应用程序打开并且用户收到新通知时,它不应该是推送通知,而是应用程序内通知。我想我可以用websocket-connections(?)。我有设置WebSocket连接并将其与redis连接的经验。
- 当用户离线时,通知应该被存储并在用户重新在线时推送(Kafka?).
- 我想将所有通知保存在数据库中。这些帖子当前存储在postgres数据库中。我应该使用相同的数据库还是应该使用类似mongodb的数据库?
我有redis pub/sub的经验,但没有rabbitmq或Kafka的经验。我目前正在学习Kafka(我已经设置了本地服务器,并且正在使用kafkajs
发布/订阅消息)。我有使用nodejs和ws
设置套接字连接的经验。
我正在阅读Kafka,因为它似乎可以将消息“存储”在主题(队列)中。对于离线用户的另一个解决方案是在redis中创建一个消息“队列”,但这样我可能最终会得到一个很大的redis数据库(该应用程序现在有大约12,000个用户)。
到目前为止,我的想法是:
- 创建一个Kafka服务器,主题为
answers
和views
。answers
的所有通知都会转到此主题,适用于每个用户。我不会为每个用户创建一个单独的主题。 - 在nodejs-backend中创建一个Kafka消费者,并将其附加到
ws
。当用户上线时,启动消费者。难点在于:当消费者收到消息时,是否将其从队列中删除?因为当所有消息都转到同一个主题时,所有消费者都会收到相同的消息:当用户A在线而B离线时,B收到通知,它将被用户A发起的消费者拾取,但由于用户A不是接收者(我将检查消息内容),通知不会通过套接字连接发送,但它仍然从Kafka主题队列中删除?* 如何在特定用户需要的主题中“挑选”消息,同时将其他消息保留在队列中?*
1条答案
按热度按时间hsgswve41#
首先,我不认为Kafka不是一个很好的选择。你可以将事件发送到Kafka,但是将它们保存在其他地方(也不确定Redis是否是一个好的选择)
当消费者收到消息时,是否将其从队列中删除?
Kafka的,不。默认情况下,邮件将保留一周。您计划如何为离开时间超过此时间的用户发送数据?
所有消费者都会收到相同的消息
对。这就是为什么你应该把数据存储在其他地方,在那里你可以按用户过滤
Amazon SNS / Firebase可以发送实际的推送通知。你不需要一个WebSocket和一个消息队列来处理这个问题。