3

需求

我有以下情况:

  • ~10万玩家
  • 50 名管理员

每个玩家可以与每个管理员进行 1:1 对话;玩家甚至可以在单独的对话中同时与所有管理员进行一对一的对话。

但在任何时候,其中一个对话的管理员可能会邀请另一个(或许多)管理员加入这数千个对话中的一个。

额外的:

  • 使用 MAM 存储的所有消息default:always
  • 流管理与resend_on_timeout:true.
  • 玩家无法向其他玩家发送消息

例子:

  • 假设玩家 1 有 3 个活跃的单独对话P1:Admin A, P1:Admin G, P1:Admin H
  • 然后管理员 A 邀请管理员 H 加入P1:Admin A对话(管理员 H 被邀请加入管理员 A 的对话不会关闭活动P1:Admin H对话),玩家将拥有这些活动对话:
    • P1:Admin A + Admin H, P1:Admin G,P1:Admin H

解决方案 #1:Muc 房间

我正在考虑将所有对话变成私人不可发现的 MUC 房间(当用户想与管理员聊天时,客户端将发出一个自定义 IQ,我将开发的 ejabberd 模块将处理并创建房间,将玩家和管理员自动在这个新房间中列入白名单)。

对于可能意味着 500 万个 MUC 房间的示例场景。我知道 500 万次正常聊天是很常见的情况,但是有这么多房间可以吗?

解决方案 #2:XEP-0033 扩展节寻址

对于此解决方案,我正在考虑将消息识别为具有扩展元素的房间的一部分channel。这样,收件人可以进入并进行对话。

但这没有 MUC 房间的安全控制,只有白名单用户可以在频道中交谈。有没有办法用这种方法克服这种隐私问题?

channel使用该元素的示例:

P1:管理员 A + 管理员 B,房间 1

<message to='header.org' from='player1'>
   <addresses xmlns='http://jabber.org/protocol/address'>
     <address type='to'  jid='adminA'/>
     <address type='to'  jid='adminB'/>
   </addresses>
   <channel xmlns='chanel:namespace' id='1'>
   <body>Hi admin A and admin B!</body>
</message>

管理员 B 离开,P1:管理员 A,仍然是房间 1

<message to='header.org' from='player1'>
   <addresses xmlns='http://jabber.org/protocol/address'>
     <address type='to'  jid='adminA'/>
   </addresses>
   <channel xmlns='chanel:namespace' id='1'>
   <body>Hi admin A only on the same room!</body>
</message>

最终解决方案?

考虑到客户端和服务器定制不是问题......考虑到所有要求,哪个解决方案是最好的?还是有其他最优解?

4

1 回答 1

2

我有一个类似的设置,这就是我的处理方式:对话从 1:1 聊天开始,因为其中大多数总是 1:1,但如果管理员想邀请另一个管理员甚至另一个用户,我会转换聊天进入 MUC 会议,如 XEP-0045 中所述

这些会议室是隐藏的,仅限成员,但它们不是持久的(在最后一个占用者退出后被销毁)。

如果您只打算使用自定义客户端,多播策略 (XEP-0033) 也可以。如果您使用现有客户端,您将无法控制房间。

于 2016-04-05T16:43:31.217 回答