需求
我有以下情况:
- ~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>
最终解决方案?
考虑到客户端和服务器定制不是问题......考虑到所有要求,哪个解决方案是最好的?还是有其他最优解?