Socket.io私人消息通知

5

你好stackoverflow!我正在使用Laravel3开发一个社区,现在我想要实现一些类似Facebook私信的功能。

我已经完成了编码部分,但我和我的朋友们都认为添加实时消息通知非常重要。我做了研究,但我不能说我找到了一篇好的文章来解决这个问题,其中一些文章以 哦,你知道矩阵中的所有东西,那就让我们使用socketsocketsocketsocketsocket 开头,我很困惑该如何开始,从哪里开始,这是什么玩意儿,还有很多人建议 选择 MongoDB,永远不要再使用 MySQL 了。 伙计,这是什么鬼?我正在使用 MySQL,在 Laravel 中创建了一个不错的私信系统,我想添加实时通知!

我想要做的只是:

  1. UserA 向 UserB 发送一条消息
  2. 将消息插入privmsg表中。
  3. Sockets或您建议的任何内容,告诉UserB的浏览器来自UserA的+1新消息
  4. UserB看到有一条未读消息,而不刷新页面并单击它即可阅读它。

我该如何实现这一功能? Socket.io 是最好的选择吗? 如果是,我该如何使用它? 任何片段都很棒!或者与我的情况相关的教程 :)

我会非常感激。


1
可能是https://dev59.com/Kmct5IYBdhLWcg3wQ7bP的重复问题。此外,阅读Laravel论坛上的这个帖子http://forums.laravel.io/viewtopic.php?id=891以获取有关实现实时通信的更多建议。 - Bartek
我确实进行了搜索,但最终没有找到那个问题 :| 不过还是谢谢 :) - T. Cem Yılmaz
1个回答

11
你遭受了一种错误的思维方式,即“X总是比Y好,所以总是使用X”。可能已经有一个名字了...甚至可能已经写了几本书。我们从你的第一个问题开始:
“这什么玩意儿啊?很多人都说 '用MongoDB,永远不要再用MySQL了。' 大兄弟怎么回事?”
你应该停止和那些说这种话的人交往。MySQL 和 MongoDB 是两种非常不同类型的数据库系统。它们通常被称为基于表格和基于文档的。在 MySQL(任何使用 SQL 的其他数据库,也可能是一些不使用 SQL 的数据库)中,数据存储在由特定架构概述的关系表集合中。表中的每个记录符合特定的字段和特定类型的集合。这种类型的数据库非常适合许多类型的数据。
MongoDB 是基于文档的数据库类型,通常被称为“NoSQL”(不仅仅是 SQL)。每个文档可以具有完整的结构,包括具有子节点和孙子节点的节点。每个文档可以有其自己独特的数据集合。文档存储在“collections”中。这种类型的数据库具有一些优点...对于某些操作,它可以非常快速。尽管如此,对于某些其他事情却不太好,比如当你有一堆相同类型的数据时。类似这样的数据库上的数据聚合非常慢(但它正在变得越来越好!)。
我想说的是,MySQL 和 MongoDB 只是不同的工具,为不同的工作而设计。不要因为朋友告诉你螺丝钉比钉子更好就用螺丝刀敲钉子。
“我只想做的是:UserA 向 UserB 发送一条消息;消息插入 privmsg 表中;使用套接字或您建议的任何东西,告诉 UserB 的浏览器有 +1 条来自 UserA 的新消息;UserB 看到有一条未读消息而无需刷新页面并单击以查看它。”
同样,选择正确的工具也是很重要的一步。Socket.IO 用于在服务器和客户端之间设置通信通道。它提供了 Web 套接字类似的功能,通常在 Node.js 服务器和 Web 浏览器之间使用(但也可以在其他上下文中使用!)。其两个主要特点是,在 Web 套接字不可用时它提供回退传输(使其与旧版浏览器兼容),并且它将事件消息系统包装在一些漂亮简单的调用中。您不必担心底层通信。只需在一端发出“emit”事件,另一端就会触发它。简单。
对于服务器和浏览器之间的实际通信,Socket.IO 是一个非常好的选择。它提供几乎实时的通信。但是,Socket.IO 并不是某种可以解决所有问题的魔法。如果它是的话,那么它几乎对每个人都没用了。

为了使您的消息持久化,将它们存储在数据库中是一个不错的选择。我会这样做:

  1. 在发送消息时,将其副本插入数据库
  2. 在插入时,向群集中其他服务器发布通知
  3. 任何连接到接收消息用户的服务器都将看到来自其他服务器的此通知。
  4. 该服务器将从数据库中加载用户的消息数据并通过 Socket.IO 发布它

想要教程吗?Socket.IO 主页上的例子非常好:http://socket.io/


这是对问题中包含的某些语句的非常好的解释。然而,我认为 OP 可能会在将 Laravel 与 Socket.IO 结合使用时遇到困难。我将在评论中添加一些相关链接。 - Bartek
嗯,@Brad我有一个问题:我的项目涉及线程和帖子。它是一个社区,但只是用于创建主题和发布帖子,没有其他功能,但在我的国家非常受欢迎。我有700万个帖子和2万个用户。我应该坚持使用MySQL还是NoSQL系统更适合这项工作? - T. Cem Yılmaz
1
@AkainuLionheart,您的用户数量大小有点无关紧要。重要的是您的数据结构。您的情况听起来适合使用传统的关系型数据库。如果您发现由于所有索引而导致INSERT速度成为真正的问题,那么可以考虑使用NOSQL系统。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接