我正在开发一个Java应用程序(JSP/servlet),用户可以在其中相互发送消息。为此,我在MySQL中使用单个表,其中包含msg_id
, sender_id
, receiver_id
, msg_content
等字段。当user_A向user_B发送消息时,我想向user_B弹出一个通知,表明他有一条新消息(类似于Facebook通知的工作方式)。
我已经搜索了一个解决方案,并发现,一个可能的方法来实现它是通过AJAX轮询。这意味着,例如,应用程序将每60秒检查上面提到的表的新行(消息到user_B),如果发现新消息,那么它将弹出消息。
但是,假设连接了100个用户。这意味着对于每个用户来说,每60秒就会有一个对数据库的请求,这听起来很糟糕。
当上面的例子发生时,应用程序不会变得非常"沉重"吗?实现这一目标的其他选择是什么?对于这种情况,我建议使用socket和一些消息代理,例如RabbitMq,但是还有很多其他的。与重复检查状态不同,您可以在消息代理和服务器中创建消息查询,因为所有客户端都通过套接字连接到该消息代理。当出现新消息时,将其发送给所有相应的消息查询。连接到相应查询的相应客户端将立即通过套接字获得消息。
如果我没弄错的话,对于web应用程序,你可以使用websocket来创建与浏览器的连接。这就是facebook的通知方式。
关于客户端(javascript)实现和良好的解释,请参阅此链接。还有一些服务器端示例,但不是针对PHP的(例如Node.js或python)
在这个链接中,你可以找到完整的PHP实现(但不是很好的解释)。