【发布时间】:2018-06-22 00:59:21
【问题描述】:
我在我的数据中心托管了一个 Ejabberd v17.11 实例,它一次为大约 20 个域提供服务,我们使用 MySQL v5.6 和 Ejabberd MySQL 默认模式作为我们的数据库,因为我们想使用我们以前的客户端数据库(是的,LDAP应该是更好的解决方案,我之前尝试过建议)。几天前,我和我的同事试图想办法在我们的前端客户端(JSXC)中显示用户的名字和姓氏,以便用户可以在他们的联系人列表(或名册组)中以更友好的方式识别彼此。
经过一些研究,我们发现了来自 Ejabberd 的 mod_vcard,我们已经投入使用。由于我们服务于大约 20 个域,我们的 mysql ejabberd.vcard 表很有可能携带重复的用户名,因为这个特定字段引用了用户名并忽略了它的域。
为了澄清,以仅包含来自域 1 的用户的 vcard 表为例。在那里,我们没有两个具有相同用户名的用户,因此我们没有冲突,用户可以正常登录并拥有显示他们的电子名片。
+----------+-------+------------+
| username | vcard | created_at |
+----------+-------+------------+
| john.doe | (...) | (...) | (this John is from domain 1)
+----------+-------+------------+
当我们尝试从域 2 中创建用户的电子名片时,我们遇到了一个名为 John Doe 的两个用户(每个域一个)的示例冲突,我们遇到了第一个问题。
+----------+-------+------------+
| username | vcard | created_at |
+----------+-------+------------+
| john.doe | (...) | (...) | (this John is from domain 1)
| john.doe | (...) | (...) | (this John is from domain 2)
+----------+-------+------------+
当我们尝试登录我们的前端客户端时,我们意识到 vcards 不再适用于所有人,我们的嫌疑人依赖于这样一个事实,即没有域,ejabberd 不知道如何处理这些冲突。有人遇到过这个问题吗?我们曾想过让一个 Ejabberd 实例为每个域拥有自己的数据库,但这有点愚蠢,所以我们不知道该怎么做。
【问题讨论】:
标签: erlang xmpp ejabberd vcf-vcard