【问题标题】:RabbitMQ source code - How do rabbitmq-boot-steps work?RabbitMQ 源代码 - rabbitmq-boot-steps 是如何工作的?
【发布时间】:2015-03-20 09:01:59
【问题描述】:

我是 erlang 和 rabbitmq 的新手,开始浏览 RabbitMQ 代码库。我发现在 rabbit.erl start/2 函数中实现了,但似乎 start/0 或 boot/0 是 rabbitMQ 启动需要调用的函数。对于一个非常基本的问题,我们深表歉意,但非常感谢在理解 RabbitMQ 的代码流方面的任何帮助,特别是对于启动和 rabbit-boot-step 过程。

提前致谢。

【问题讨论】:

  • 您能否提供您正在查看的源代码的 URL?我想我明白你在问什么,但一些代码将有助于巩固我的想法。

标签: erlang rabbitmq


【解决方案1】:

您正在查看的 RabbitMQ 文件 rabbit.erl 实现了 Application behaviour。这意味着当 Erlang VM 被告知启动 rabbit 应用程序时,它将寻找一个 .app 文件(RabbitMQ 位于 ebin/rabbit_app.in 中)。在第 16 行,您可以看到 rabbit 是负责启动应用程序的模块。 Erlang 假设模块实现了应用程序的行为(如果没有,你肯定会遇到错误)。一旦 Erlang 完成所有设置,它就会调用 rabbit.erl 中的 start/2 回调。这反过来又调用rabbit_sup:start_link/0。我以前从未使用过 RabbitMQ,所以我不确定之后会发生什么,但很可能主管启动了 RabbitMQ 运行所需的所有其他主管和工作进程。

至于start/0boot/0,它们不是Erlang回调函数。它们是由 RabbitMQ 工程师创建的自定义函数。我想这些函数用于在特定场景中启动应用程序(例如测试、在开发过程中在解释器中启动应用程序等)。

希望这会有所帮助!检查 Erlang 模块时,请始终查找 behaviour 模块属性 (-behaviour(application).)。一旦您知道模块实现了什么行为,您就可以查找该行为 (erlang application behavior) 并了解更多关于事情如何工作的信息。

【讨论】:

  • 哦,是的... Erlang 使用英式拼写来表示单词 behavior。所以在定义模块行为时总是写-behaviour :)
  • 谢谢。我确实错过了一些东西,因为我确实查看了 rabbit_sup.erl 和 start_link/2 以及在 rabbit_sup.erl 中实现的 init/1 函数,但不清楚所有其他进程是如何启动的。 rabbit_sup 中的 init/1 函数看起来像 init([]) -> {ok, {{one_for_all, 0, 1}, []}}。 - 此调用中未提及子规范。
  • 是的。那没有任何作用。 run_boot_steps/1 之后被start/2 调用,然后run_boot_steps/1 多次调用run_step/3(在rabbit.erl 中的第366 行附近)。我想这就是所有其他过程的开始。代码看起来确实有点难以理解。如果我回答了您的原始问题,请考虑将其标记为已接受。
  • @Stratus3D RabbitMQ 不像标准的 OTP 应用程序那样开始,所以很多东西在这里不适用。无论如何,请参阅我的答案或此链接github.com/videlalvaro/rabbit-internals/blob/master/…
  • @Stratus3D start 和 boot 函数实际上也用于启动 RabbitMQ,它们与测试或任何这些场景无关
【解决方案2】:

RabbitMQ 启动过程记录在这里:https://github.com/videlalvaro/rabbit-internals/blob/master/rabbit_boot_process.md

我很想知道你为什么要调查这个。

【讨论】:

    猜你喜欢
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    相关资源
    最近更新 更多