您会遇到这样的问题:“X 总是比 Y 好,所以总是使用 X”。它可能有一个名字......甚至可能写了一两本书。谁知道。让我们从你的第一个问题开始:
这到底是什么鬼东西,很多人说“使用 MongoDB 永远不要再使用 MySQL”。哥们什么鬼?
你应该停止花时间和说这话的人在一起。MySQL 和 MongoDB 是用于两种非常不同类型的数据库的数据库系统。它们通常被称为基于表格和基于文档。使用 MySQL(使用 SQL 的任何其他数据库......可能还有一些不使用),您的数据存储在一组由非常特定的模式概述的关系表中。此表中的每条记录都符合具有特定类型集的特定字段集。这种类型的数据库非常适合多种数据。
MongoDB 是基于文档的各种数据库,通常称为“NoSQL”(意思是 not-only-SQL)。每个“文档”都可以有一个完整的结构,包括有子节点和孙子节点的节点。每个文档都可以有自己独特的数据集。文档存储在“集合”中。这种类型的数据库有一些优点......对于某些类型的操作来说它可能非常快。话虽如此,这对于其他事情来说是很糟糕的,例如当你有一堆类型完全相同的数据时。像这样的数据库上的数据聚合非常慢(但它一直在变得更好!)。
我要说明的一点是 MySQL 和 MongoDB 只是不同的工具,专为不同的工作而设计。不要仅仅因为你的朋友告诉你螺丝比钉子好就用螺丝刀敲钉子。
我要做的就是: UserA 向 UserB 发送消息;消息插入到 privmsg 表中。套接字或您建议的任何内容,告诉用户 B 的浏览器有来自用户 A 的 +1 新消息;UserB 看到有一条未读消息没有刷新他的页面并点击阅读它。
再次,为工作选择工具。了解您的工具是一个好的开始。Socket.IO 旨在建立服务器和客户端之间的通信通道。它提供了类似 web-socket 的功能,通常在 Node.js 服务器和 web 浏览器之间使用(但也可以在其他上下文中使用!)。它的两个主要特性是它在 Web Sockets 不可用时提供后备传输(使其与旧浏览器兼容),并且它在一些漂亮而简单的调用中封装了一个事件消息传递系统。您不必担心底层通信。一方面emit
是事件,另一方面是事件。简单的。
对于服务器和浏览器之间的实际通信,Socket.IO 是一个很好的选择。它提供近乎实时的通信。但是,Socket.IO 不仅仅是一种可以为您解决所有问题的魔法。如果是的话,对几乎每个人来说都是无用的。
由于您的消息需要持久化,因此将它们存储在数据库中是一个好主意。我会做什么:
- 在发送消息时,将副本插入数据库
- 插入时,通过您的 pub/sub向集群中的其他服务器发出通知
- 任何与获取消息的用户有连接的服务器都将看到来自其他服务器的此通知。
- 该服务器将从数据库中加载用户的消息数据并通过 Socket.IO 发出它
你要教程吗?Socket.IO主页上的例子相当不错: http ://socket.io/