3

最近,我一直在阅读 IRC 协议(RFC 1459、2810-2813),并且正在考虑实现自己的服务器。

我不一定要认真地遵守 IRC 协议(毕竟我这样做是为了好玩),但我喜欢它的一件事是网络可以透明地由多个服务器组成。

关于协议或 IRC 规范,我有很多不喜欢的地方。首先是昵称没有所有权。虽然存在像 NickServ 这样的服务,但它们不是官方协议的一部分。另一方面,适当地实施像 NickServ这样的东西会破坏分发的目的(即会有一个地方运行 NickServ,并为它存储一个数据)。

我希望有一种方法可以在每个服务器的基础上管理昵称。这样做的问题是,如果您有两个具有一些注册昵称的服务器,然后它们链接起来,您可能会发生冲突。

有没有办法在不使用一个中央数据存储的情况下避免这种情况?也就是说:是否可以保持服务器松散连接(这样它们每个都作为一个独立的实体存在,但也可以相互连接)并保持昵称之间的唯一性?

我意识到这个问题很模糊,但我想不出更好的措辞方式。我正在寻找更多的建议而不是实际的是/否答案。因此,如果有人对如何在保持服务器独立性的同时在网络中实现昵称唯一性有任何想法,我很想听听。请注意,完全没有必要严格遵守 IRC 协议。我可以根据自己的目的进行更改。:)

4

5 回答 5

3

如果您不关心严格实现 IRC 服务器,而是实现类似于IRC 但不完全是IRC 的分布式消息系统,那么有一个简单的解决方案。

简单的解决方案是使用“nick@host”形式的昵称,就像电子邮件一样。因此,我的昵称不仅仅是“mipadi”,还可以是“mipadi@free-memorys-server.net”。所以我只在你的服务器上注册,但是当你的服务器与其他服务器连接起来形成另一个大型聊天网络时,你可以轻松地将所有用户名合并在一起。otherserver.net 上可能有一个“mipadi”,但后来我们的昵称变成了“mipadi@free-memorys-server.net”和“mipadi@otherserver.net”,一切都很酷。

当然,这与 IRC 有很大的不同。:)

于 2009-01-13T17:47:41.710 回答
0

他们必须互相了解。如果没有,您将无法阻止共享昵称。如果是,您只需要在后端传输更新。为了防止同时注册,您需要一个交易系统来阻止、请求所有其他服务器的许可并做出响应。

为了防止在中断期间同时注册,您别无选择,只能为注册添加时间戳,并删除除最后一个(或真正同时的随机)注册的昵称副本之外的所有副本。

考虑到这些服务器最初没有合并,这不是很漂亮。

于 2009-01-13T17:47:05.737 回答
0

如果您的服务器实例相互信任,您仍然可以在没有中央实例的情况下实现昵称所有权。

  • 当用户注册一个昵称时,它会在他连接的当前服务器上注册
  • 当服务器接收到它不知道的注册信息时,它将该信息转发给所有其他还不知道的服务器(可能需要一个智能算法来避免向网络发送垃圾邮件)
  • 当服务器重新连接到另一台服务器时,它会尝试同步已注册昵称的列表以及哪个服务器处理哪个昵称
  • 如果在同步期间发生冲突,则使用较旧的注册,并将较新的注册标记为无效

如果您不能信任您的服务器,那么它会变得更加困难,因为服务器可以轻松地声明每个用户名,甚至声明每个用户名的最旧注册。

于 2009-01-13T17:51:21.123 回答
0

由于您正在尝试提出新的想法,因此想到的想法只是在与服务器外部通信时将服务器的独特之处作为昵称的一部分。因此,如果您想向其他服务器上的用户发送消息,您可能会有类似 user@server 的信息

如果您不需要它们完全分开,您可能需要考虑创建某种多主复制帐户数据库。每台服务器都存储帐户数据库的完整副本,并且每台服务器都可以创建新帐户,这些帐户将尽可能复制到其他服务器。不过,您有时可能仍需要处理碰撞。

于 2009-01-13T17:51:47.817 回答
0

虽然存在像 NickServ 这样的服务,但它们不是官方协议的一部分。

服务不是官方协议的一部分,因为它们与协议无关。他们是具有权限的机器人。没有理由不能在每台服务器上运行一个,但这确实使它们更难维护。

如果你要走这条路,我可能会建议常用的“多主”数据库复制技术。如果收到写入(在您的情况下,创建或更新新用户等),它将数据发送到所有其他节点。不过,您必须小心。如果一个节点在其他节点获得更新时处于脱机状态,则它需要知道在重新连接时重新同步。

另一种技术与上述相同,但相反。数据仅在需要时在节点之间交换。例如,如果用户尝试在没有数据的节点上登录,它将查询其他节点并发出移动命令以将所有数据获取到该节点。这可能没有复制版本那么痛苦,但是如果有人在与包断开连接的节点上注册一个重复的昵称,则 netsplits 可能会出现严重问题。

消除 netsplits 问题的一种技术是让聊天节点及其机器人知道 netsplits。当它们被拆分时,它们可能不应该允许任何写入操作......但是如果您拆分很多,这可能会影响您的网络。

您还必须询问这可能或可能不安全。IRC 网络节点是为性能而分布的,但它们并不“安全”。因此,服务机器人通常集中运行以保持对其运行的最终控制。如果您分发了机器人并且远程节点被黑客入侵,他们可能会访问整个用户数据库(取决于模型)。

于 2009-01-13T18:00:43.103 回答