Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka Erlang行为真的和类继承一样吗?_Apache Kafka_Erlang_Kafka Consumer Api_Behavior_Erlang Supervisor - Fatal编程技术网

Apache kafka Erlang行为真的和类继承一样吗?

Apache kafka Erlang行为真的和类继承一样吗?,apache-kafka,erlang,kafka-consumer-api,behavior,erlang-supervisor,Apache Kafka,Erlang,Kafka Consumer Api,Behavior,Erlang Supervisor,目前,我正在从事一个数据管道项目,利用ApacheKafka和Erlang作为流处理器语言(从年初开始,除了学习该语言和概念外,我实际上没有使用Erlang的经验)。为了编写卡夫卡消费者,我们依赖于坚如磐石的模块 我理解,我必须编写一个主管回调模块,负责启动我的brod_客户机和我的group_消费者模块 my_app +-- my_sup +-- brod_client +-- my_group_consumer 我编写的这个group_consumer模

目前,我正在从事一个数据管道项目,利用ApacheKafka和Erlang作为流处理器语言(从年初开始,除了学习该语言和概念外,我实际上没有使用Erlang的经验)。为了编写卡夫卡消费者,我们依赖于坚如磐石的模块

我理解,我必须编写一个主管回调模块,负责启动我的brod_客户机和我的group_消费者模块

my_app
  +-- my_sup
        +-- brod_client
        +-- my_group_consumer
我编写的这个group_consumer模块是brod_group_subscriber_v2行为的回调模块,它本身就是gen_服务器的回调模块

my_group_consumer > brod_group_subscriber > gen_server
当我运行我的应用程序时,我的主管正在启动brod_客户端,但不是我的消费者
erlang:whereis(我的\u组\u消费者)。
返回
未定义的
。只有在消息到达后,brod_group_consumer_v2本身似乎才初始化my_group_consumer并调用其消息处理函数。这个“懒惰”初始化对我来说是有意义的,但与我所期望的不同,因为我配置了主管来明确地照顾我的_组_消费者(而不是它的基本行为)

因此,在所有这些之后,我不确定我是否准确地理解了行为,因此也不确定我是否正确地使用了brod模块,因为我试图像Java类继承和多态性那样从它们继承

很难找到brod用于主管而不仅仅用于shell演示的例子

编辑:我在这里使用brod作为一个情况/用例的示例,我希望大多数专业模块的实现“继承”自mst通用模块,但事实并非如此,因此我无法正确使用brod这样的模块


有人能给我解释一下概念的不同吗?如果你想根据我的例子来解释,那就太好了,如果你能用另一个例子或根本没有例子来解释……也很好,提前谢谢。

就像@alexey romanov在一篇评论中所说的那样,我相信你最终会遇到一个与标题中的问题截然不同的问题。 尽管如此,如果您仍然对学习如何理解Erlang/Elixir行为感兴趣,我不久前写了一篇文章并给出了答案。 希望这有帮助:)

同一个模块可以是行为和定义的回调模块 另一个如果现有的行为让你走了一半路,你可以 就像OTP一样,在上面建立新的行为;)"

…我希望有第三篇文章正好涵盖这一点;)

以下示例适用于我——它在
gen\u服务器
上实现了
my\u服务器
行为:

my_server.erl:

-module(my_server).
-compile(export_all).

-behaviour(gen_server).
-callback go( integer() ) -> atom().  %% Specifies that this module is a behaviour
                                      %% which has one required callback function go/1

%%%   required gen_server callback functions

init(_Args) ->
    {ok, []}.

handle_call(Msg, _From, State) ->
    io:format("In handle_call(), Msg= ~w~n", [Msg]),
    {reply, hello_from_handle_call, State}.

handle_cast(Msg, State) ->
    io:format("In handle_cast(), Msg= ~w~n", [Msg]),
    {noreply, State}.

handle_info(Msg, State) ->
    io:format("In handle_info(), Msg= ~w~n", [Msg]),
    {noreply, State}.
b、 厄尔:

-module(b).
-compile(export_all).

-behaviour(my_server).

%%  my_server callback functions

go(_Count) ->
    ?MODULE ! hi_from_go,  %% handle_info() gets this message
    hi.

%% client functions

start() ->
    gen_server:start_link( %% Calls the init() gen_server callback function.
      {local, ?MODULE},    %% Registers the gen_server using this name.
      my_server,           %% Looks for the gen_server callback functions in this module.
      [],
      []
    ).

do_call() ->
    spawn(
      fun() -> gen_server:call(?MODULE, hello) end  %% handle_call() gets this message
    ).

do_go() ->
    spawn(
      fun() -> go(20) end
    ).
在外壳中:

1> c(my_server).
my_server.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my_server}

2> c(b).
b.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,b}

3> b:start().
{ok,<0.76.0>}

4> b:do_call().
In handle_call(), Msg= hello
<0.78.0>

5> b:do_go().
In handle_info(), Msg= hi_from_go
<0.80.0>
1>c(我的服务器)。
my_server.erl:2:警告:导出所有标志已启用-将导出所有功能
{好的,我的服务器}
2> c(b)。
b、 erl:2:警告:已启用导出\u所有标志-将导出所有功能
{好的,b}
3> b:开始()。
{好的,}
4> b:do_call()。
在handle_call()中,Msg=hello
5> b:去吧。
在handle_info()中,Msg=hi_from_go

您最后提出的问题似乎与标题基本无关。您是对的!我编辑的目的是为了说明,brod消费者应该只是一个例子……我想了解有关解释这些概念以及它们如何相互映射的建议。在您的第二篇文章中,您写的最后一句话>“5。最后,使用现有的行为,记住你不需要每次都从头开始。同一个模块可以是一个行为的回调模块,也可以定义另一个行为。如果一个现有的行为让你半途而废,你可以像OTP一样在它的基础上构建新的行为;)“…我希望有第三篇文章能完全涵盖这一点;)我会看看我是否能写这篇文章。无论如何,wpool()就是一个很好的例子…通过它,您可以使用gen_服务器接口构建一个池。谢谢,这澄清了我的问题,也可以复制给我。”