你遭受了一种错误的思维方式,即“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 并不是某种可以解决所有问题的魔法。如果它是的话,那么它几乎对每个人都没用了。
为了使您的消息持久化,将它们存储在数据库中是一个不错的选择。我会这样做:
- 在发送消息时,将其副本插入数据库
- 在插入时,向群集中其他服务器发布通知
- 任何连接到接收消息用户的服务器都将看到来自其他服务器的此通知。
- 该服务器将从数据库中加载用户的消息数据并通过 Socket.IO 发布它
想要教程吗?Socket.IO 主页上的例子非常好:http://socket.io/