【问题标题】:Storing ejabberd presence info in database在数据库中存储 ejabberd 存在信息
【发布时间】:2015-10-08 15:50:16
【问题描述】:

假设这个概念设置:

  • ejabberd 集群(云中的实例或托管 SaaS)
  • ejabberd MySQL 数据库(其他一些托管解决方案)
  • 网站实例
  • 网站 MySQL 数据库(与 ejabberd 数据库相同的位置,但不同的数据库)

同样相关的是,目前网站实例已经直接访问 ejabberd MySQL 数据库,以添加新用户(不需要名册和其他类似的东西,因此避免了 xml_rpc 开销——尽管这可能会在未来发生变化) .

现在我想编写一个模块,将存在信息存储在可以从网站访问的数据库中。

哪种解决方案的可扩展性和稳定性更好?

  1. 向 ejabberd MySQL 表添加一个新表,并使用 ejabberd 中其他地方使用的相同类型的代码与数据库对话以写入存在信息

  2. 拆分 http 请求,让网络服务器编写

我不熟悉 Erlang 以及挂断/瓶颈可能在哪里......我猜这两种方法有点相似,并且数据库方法会更好,因为已经有对连接池的内部支持......但只是想在开始编码之前检查一下。

【问题讨论】:

    标签: redis erlang ejabberd


    【解决方案1】:

    您可以使用其他方法,或者:

    1. 查询 ejabberd 以从内存中获取存在。为此,您可以使用 HTTP,使用 XML-RPC 或 Rest API。

    1. 为 ejabberd 使用 Redis 会话后端并从 Redis 读取会话状态。您可能想查看sm_db_type 选项。出于性能原因,它只会存储一条记录,如果会话在线,而不是用户的实际存在。这种 Redis 方法不会更改身份验证后端并用于临时会话。

    案例 1 更有效,但可能不实用,具体取决于您计划如何使用状态。情况 2 效率稍低,但在所有情况下,都比使用 MySQL 或 HTTP 请求更有效。

    【讨论】:

    • 谢谢!三个快速跟进问题- 1) Redis 仅用于临时数据,不会提供登录/密码,对吗? 2)如果使用“sm_db_type:redis”,存在不会自动存储,而是我仍然需要编写一个简单的模块来存储它? 3) 远程从内存中查询 ejabberd 存在的最有效方法是什么(可以通过 xmpp 客户端或 http 或其他方式 - 可能来自 google appengine)
    • btw- 只是说,我真的很喜欢 ejabberd 的文档和易用性,以及您在 stackoverflow 上的帮助,非常感谢! (另外——我尝试在 node.js + redis 中编写一个聊天集群的东西,并且对尝试解决服务器故障和类似问题的情况感到沮丧......很高兴能够使用经过实战验证的解决方案,即使只是为了研发现在!)
    • 感谢您的客气话。关于您的问题: 1. 是的,redis 用于瞬态数据。 2. 会话状态下redis中存储了什么。您可以知道用户是否在线(但不是实际的在线状态,出于性能原因,可能会经常更改) 3. 要查询 ejabberd 在线状态,您可以使用 ejabberd XML-RPC 或 Rest API。更新了答案以解决您的问题。
    • 酷。只是有点困惑——选项 1(XML-RPC 或 REST API)比直接查询 Redis 更有效吗?我只需要知道用户是否在线,而不是实际存在的类型:)
    • 我们还没有这方面的文档,但在 ejabberd 文档 Github 上创建了一张票以提醒您这样做:github.com/processone/docs.ejabberd.im/issues/4
    猜你喜欢
    • 2015-05-28
    • 2010-12-05
    • 2013-11-28
    • 1970-01-01
    • 2015-08-07
    • 2020-07-01
    • 2011-06-19
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多