基于 Websockets 的存储后端

Posted

技术标签:

【中文标题】基于 Websockets 的存储后端【英文标题】:Storage Backend based on Websockets 【发布时间】:2014-02-18 14:43:50 【问题描述】:

我现在花了很长时间研究服务器后端/API/框架。我需要一个可以存储用户内容(JSON 和二进制数据)的解决方案。 显而易见的选择是 REST API。唯一缺少的元素是当服务器上的数据发生更改并且应立即通知客户端时的推送功能。随着对这个问题的更多研究,我发现了经典方法(Comet、Push、Server sent events、Bayeux、BOSH 等)以及“新”联盟 Websockets。我肯定更喜欢使用 Websockets 或直接使用 TCP Sockets 的方法。但是这篇文章不是关于这两种技术的优缺点,所以请克制自己不要在 cmets 中被旁注。

目前存在以下与我的需求非常相似的项目: - Simperium (simperium.com),这看起来很有希望,但遗憾的是核心/服务器不是开源的,天知道什么时候,如果有的话,这一步会发生 - Realtime.co (framework.realtime.co/storage),托管服务,但原理相同 - 一些用于构建服务器的框架,例如 Atmosphere(java,没有 WAMP)、Cometd(java,项目页面看起来像是停留在 90 年代)、Autobahn(python,WAMP)

我最喜欢的是 Autobahn 框架 (autobahn.ws)。特别是使用 WAMP 协议(​​Websocket 的子集),因为它提供了我所需要的。所以这个想法是用 Autobahn Python(基于 Twisted 框架)构建一个 python 后端/服务器,它管理所有套接字(WAMP)连接并包括一个用于数据存储的 Postgresql 数据库。对于所有需要的客户端,已经存在 WAMP 库。服务器需要能够执行典型的 REST API 功能: - 从/到服务器/客户端发送、更新、删除请求的数据(JSON/二进制) - 同步和自动冲突管理 - 连接中断时离线处理,再次连接时自动重启

所以最后的问题是: - 我是否错过了一个完全满足我需求的开源项目? - 如果我想用高速公路和数据库开发我自己的服务器,你能指出我正确的方向吗?有很多顾虑,理解不够深入。我知道 Autobahn 已经给你一个服务器,但这不是很接近我的最终需求。如何构建一个高效的服务器,以便他可以处理所有连接的套接字?当客户端需要服务器推送时如何处理?是否有架构、模型或概念这样的服务器应该是什么样子? - Twisted 是一个非常强大的 Python 框架,但并不是最方便编写应用程序的框架。但我想应该可以使用基于 Socket 的存储服务器和 db 访问权限?当我将 twisted 作为 Web 资源运行并使用其他 python 框架开发服务器组件时,这会大大降低延迟/性能吗? - 这样一个具有大量数据存储(JSON 字段以及二进制数据,如文档、图像)的理想服务器后端是否可以由单个开发人员/小团队使用 Sockets 构建,或者是这样的。目前只有 Dropbox 这样的大公司才能做到?

非常感谢您的帮助和时间!

【问题讨论】:

【参考方案1】:

所以最后的问题:

我是否错过了一个完全满足我需求的开源项目? 不,您已经介绍了开源项目。不过,开源只能让你走到一半。实施全球实时网络需要等量实施和等量操作。您必须考虑丢失的消息、重试、如果特定地理位置变热会发生什么情况如何扩展您的服务器......等等。我会争辩说,除非您愿意将大量资源投入到运营中,否则开源解决方案将无法实现您想要的。我会推荐像 PubNub 这样的服务:http://pubnub.com

如果我想开发自己的带有高速公路和数据库的服务器,您能否指出正确的方向?有很多顾虑和不够深入的了解.. 我知道 Autobahn 已经给你一个服务器,但这不是很接近我的最终需求.. 如何构建一个高效的服务器以便他可以处理所有连接的套接字?当客户端需要服务器推送时如何处理?是否有架构、模型或概念这样的服务器应该是什么样子? Cassandra 是支持实时框架的好数据库,因为它支持高写入量并能很好地处理时间序列数据:http://cassandra.apache.org/。

Twisted 是一个非常强大的 Python 框架,但并不是最方便编写应用程序的框架。但是我想应该可以使用基于 Socket 的存储服务器并具有 db 访问权限?当我将 twisted 作为 Web 资源运行并使用其他 python 框架开发服务器组件时,这会大大降低延迟/性能吗? 我不会使用 Twisted。我会使用 Gevent:http://www.gevent.org/。它基于协程,因此您不会陷入回调地狱。要支持更多连接,您只需增加 greenlet 池以侦听套接字。

这样一个具有大量数据存储(JSON 字段以及二进制数据,如文档、图像)的理想服务器后端是否可以由单个开发人员/小型团队使用 Sockets 构建,或者就是这样。目前只有像 Dropbox 这样的大公司才能做到这一点? 再一次,我不会自己构建这个。像 PubNub:http://pubnub.com 这样的服务可以为您处理所有的操作问题,并且有一个干净的 API 将以最低的成本满足您的需求。 PubNub 会为您处理协议,因此如果您在不支持 WebSockets 的移动设备上使用 TCP、HTTP 或任何适合该设备的最佳传输方式。

【讨论】:

以上是关于基于 Websockets 的存储后端的主要内容,如果未能解决你的问题,请参考以下文章

Websockets 不能在至少一台机器上工作

Websockets至少在一台机器上工作

docker上带有javascript和nginx的websockets

用于大量数据的 WebSockets 与 XHR

TCP 配置的 Amazon Elastic Load Balancer 上的 Socket.io Websockets

Websockets - 自定义排队系统有意义吗?