【问题标题】:How does ejabberd handle really high number of requestsejabberd 如何处理大量请求
【发布时间】:2015-04-29 16:46:15
【问题描述】:

ejabberd 如何处理大量请求。例如。

  • 我只有 1 个实例正在运行。

我假设:

  • 我们以 mod_offline.erl 为例
  • 此模块在服务器启动时由 ejabberd_admin 启动
  • 使用 gen_server 回调。

-- 该模块是否只有一个实例在运行,还是该模块的多个实例同时运行 -- 如果有多个,那么有多少个这样的实例?

我也很好奇需要做些什么来编写自定义模块才能同时处理大量请求。

您能否提供一些指导?

我对 erlang 和 ejabberd 很陌生。请帮助我了解 ejabberd 如何处理高请求。

最好的问候,

【问题讨论】:

    标签: erlang xmpp ejabberd


    【解决方案1】:

    典型的 Erlang 做事方式是为每个独立任务(或一组任务)生成一个进程。

    进程生成很便宜,而且调度非常轻量级并且通常会自动为您处理——因此这是在 Erlang 中建模大规模并发问题的简单方法(聊天消息是此类问题的完美示例)。

    所以它不是“模块的实例”,它是“许多进程从一个模块执行代码”——有点(具体来说,一个进程通常会在其生命周期中执行来自多个模块的代码,这是固有的任何类型的基于回调的 OTP 行为)。

    为了更好地掌握这类事情,我建议自己从头开始编写一些处理并发用户输入的 Erlang 程序。 Erlang 中的网络编程很容易。从头开始自己编写一些服务器将使您深入了解 OTP 行为为何如此运作。

    我正在编写一个中级教程,首先讨论架构,这可能会对此有所了解。代码的第一次(故意单调且非 OTP)迭代说明了如何处理网络请求以及如何生成进程以对系统的各种并发元素进行建模的许多基本思想。它仍在进行中,但目前存在的内容应该能说明您对以下问题的一些疑问:The ErlMUD Commentary

    【讨论】:

    • 那么例如对于要处理的每个offline_message,ejabberd 会产生一个erlang 进程吗?
    • @user2384694 offline_message 可能被放入一个队列(或作为队列工作的表)中,该队列根据某些标准(如预期用户上线)弹出。但是您必须检查代码才能确定; ejabberd 因其糟糕的文档而臭名昭著——解决它的地方可能是 RabbitMQ(它最初基于 ejabberd,但文档更好,并且更容易理解 IMO)。在任何情况下,消息只是消息(不是进程),但用户连接和系统的其他元素(通道等)是进程。
    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2021-02-11
    相关资源
    最近更新 更多