想想 MUD/MUCK,但可能带有头像或语言环境插图。我选择的语言是ruby 。
我需要处理多个持久连接,数据在服务器及其各个客户端之间异步传输。单个数据库必须根据客户端会话中发生的活动保持最新。每个客户端会话中的活动可能需要立即更新多个其他客户端(用户进入房间;用户向另一个用户发送私人消息)。
这是一个目标项目 ,也是一个学习项目,所以我的意图是重新发明一两个轮子来学习更多关于并发网络编程的知识。但是,我对并发编程和网络编程都很陌生。以前,我几乎只在 Web 应用程序中的非持久、同步 HTTP 请求领域工作。所以,我想确保我正在重新发明正确的轮子。
根据emboss的出色回答,我已经开始研究某些 HTTP 服务器的内部结构,因为 Web 应用程序通常可以避免线程问题,因为服务器本身将问题抽象得如此彻底。
我不想使用 EventMachine 或 GServer,因为我还不了解它们的作用。一旦我大致了解了它们的工作原理、它们解决了哪些问题以及它们为何有用,我就会对它感到满意。我的目标不是“编写游戏”,而是“编写游戏并了解一些较低级别的东西是如何工作的”。我也不清楚某些术语的界限;例如,“I/O-unbound apps”是“event-driven apps”的超集吗?反之亦然?
我当然对实现目标的一种正确方法感兴趣(如果存在),但总的来说,我想了解为什么它是正确的方法以及为什么其他方法不太可取。
任何你可以建议的书籍、电子书、在线资源、示例项目或其他花絮都是我真正想要的。
我现在做事的方式是使用IO#select
阻塞连接的套接字列表,超时为0.1秒。它将读取的任何信息推送到线程安全的读取队列中,然后每当遇到超时时,它就会从线程安全的写入队列中提取数据。我不确定超时是否应该更短。还有第二个线程轮询套接字处理线程的读取队列并处理“请求”。这比我最初的工作方式要好,但仍然可能不理想。
我在 Hacker News 上发布了这个问题,并链接到了我正在研究的一些资源;任何类似的东西都会很棒: