最近,我一直在阅读IRC协议(RFC 1459,2810-2813),我正在考虑实现自己的服务器。
我不一定会虔诚地遵守IRC协议(毕竟我这样做是为了好玩),但我喜欢的一件事就是网络可以透明地组成多个服务器。
我对协议或IRC规范有很多不喜欢的事情。首先是昵称不归属。虽然像NickServ这样的服务存在,但它们不是官方协议的一部分。在其他手上,实现像NickServ 正确这样的东西会破坏分发的目的(即有一个地方运行NickServ,并且有一个数据存储器用于它)。
我希望有一种方法可以在每台服务器的基础上管理昵称。这样做的问题是,如果您有两台具有一些注册昵称的服务器,然后它们会链接起来,则可能会发生冲突。
有没有办法避免这种情况,而不使用一个中央数据存储?那就是:是否可以保持服务器松散连接(这样它们各自作为一个独立的实体存在,但也可以相互连接)并保持昵称之间的唯一性?
我意识到这个问题很模糊,但我想不出更好的措辞方法。我正在寻找更多的建议,而不是我的实际是/否答案。因此,如果有人对如何在网络中实现昵称唯一性有任何想法,同时仍然保持服务器独立性,我会有兴趣听到它。请注意,严格遵守IRC协议并不是必需的;我改变东西以满足我的目的是没有问题的。 :)
答案 0 :(得分:3)
有一个简单的解决方案如果你不关心严格实现IRC服务器,而是实现喜欢的分布式消息系统IRC,但不是完全 IRC。
简单的解决方案是使用“nick @ host”形式的昵称,就像电子邮件一样。因此,我的昵称可能是“mipadi@free-memorys-server.net”,而不仅仅是“mipadi”。所以我只注册你的服务器,但是当你的服务器与其他服务器连接以形成另一个大型聊天网络时,你可以轻松地将所有用户名结合在一起。在otherserver.net上可能有一个“mipadi”,但是我们的昵称变成了“mipadi@free-memorys-server.net”和“mipadi@otherserver.net”,而且一切都很酷。
当然,这与IRC有很大不同。 :)
答案 1 :(得分:0)
他们必须彼此了解。如果没有,则无法阻止昵称的共享。如果是,您只需要在后端传输更新。为了防止同时注册,您需要一个事务系统来阻止,请求来自所有其他服务器的权限,并做出响应。
为防止在停电期间同时注册,您别无选择,只能为注册添加时间戳,并删除除最后一个(或随机的真正同步)注册副本以外的所有注册副本。
考虑到这些服务器最初并未首先合并,这不是很好。
答案 2 :(得分:0)
您仍然可以在没有中央实例的情况下实现昵称所有权,如果您的服务器实例互相信任。
如果您不能信任您的服务器,那么它会变得更加困难,因为服务器可以轻松地声明每个用户名,甚至可以为每个用户提供最早的注册。
答案 3 :(得分:0)
由于您正试图想出一些新的东西,想到的想法,只是在服务器外部进行通信时,将服务器的一些独特内容作为昵称的一部分。因此,如果您想在不同的服务器上向用户发送消息,您可能会使用user @ server
如果您不需要将它们完全分开,则可能需要考虑创建某种多主复制的帐户数据库。每个服务器存储帐户数据库的完整副本,并且每个服务器可以创建新帐户,这些帐户将尽可能地复制到其他服务器。你可能仍然需要偶尔处理碰撞。
答案 4 :(得分:0)
虽然像NickServ这样的服务存在,但它们不是官方协议的一部分。
服务不是官方协议的一部分,因为它们与协议无关。他们是有权限的机器人。没有理由为什么你不能在每台服务器上运行一个,但它确实使它们更难维护。
如果你走这条路,我可能会建议常用的“多主”数据库复制技术。如果收到写入(在您的情况下,创建或更新新用户等),它会将数据发送到所有其他节点。你必须要小心。如果一个节点在其他节点获得更新时处于脱机状态,则需要知道在重新连接时重新同步。
另一种技术如上所述,但相反。只在需要时才在节点之间交换数据。例如,如果用户尝试登录没有数据的节点,它将查询其他节点并发出移动顺序以将所有数据提供给该节点。这可能不如复制版本那么痛苦,但是如果有人在一个节点上注册并且从包中断开以获得重复的缺口,那么网络连接可能会出现严重的问题。
使netsplits问题无效的一种技术是使聊天节点和他们的机器人能够识别netsplit。当它们被拆分时,它们可能不应该允许任何写入操作......但如果你分裂了批次,这可能会影响你的网络。
你还要问这可能有多么安全。 IRC网络节点是为了性能而分发的,但它们并不“安全”。因此,服务机器人通常集中运行以保持对其运行的最终控制。如果您分发了僵尸程序并且远程节点被黑客入侵,那么他们可能会访问整个用户数据库(具体取决于型号)。