有人可以帮我解决这个简单的分布式erlang示例。我如何运行这个erlang程序,看看它是如何工作的? 我用erl -sname pc1,erl -sname pc2和erl -sname服务器盯着3个shell 并且我从pc1和pc2服务器ping我们之间的连接。 现在我需要做什么,所以我可以测试这个程序?
-module(pubsub2).
-export([startDispatcher/0, startClient/0,
subscribe/2, publish/3]).
startClient() ->
Pid = spawn(fun clientLoop/0),
register(client, Pid).
clientLoop() ->
receive {Topic, Message} ->
io:fwrite("Received message ~w for topic ~w~n",
[Message, Topic]),
clientLoop()
end.
subscribe(Host, Topic) ->
{dispatcher, Host} ! {subscribe, node(), Topic}.
publish(Host, Topic, Message) ->
{dispatcher, Host} ! {publish, Topic, Message}.
startDispatcher() ->
Pid = spawn(fun dispatcherLoop/0),
register(dispatcher, Pid).
dispatcherLoop() ->
io:fwrite("Dispatcher started\n"),
dispatcherLoop([]).
dispatcherLoop(Interests) ->
receive
{subscribe, Client, Topic} ->
dispatcherLoop(addInterest(Interests, Client, Topic));
{publish, Topic, Message} ->
Destinations = computeDestinations(Topic, Interests),
send(Topic, Message, Destinations),
dispatcherLoop(Interests)
end.
computeDestinations(_, []) -> [];
computeDestinations(Topic, [{SelectedTopic, Clients}|T]) ->
if SelectedTopic == Topic -> Clients;
SelectedTopic =/= Topic -> computeDestinations(Topic, T)
end.
send(_, _, []) -> ok;
send(Topic, Message, [Client|T]) ->
{client, Client} ! {Topic, Message},
send(Topic, Message, T).
addInterest(Interests, Client, Topic) ->
addInterest(Interests, Client, Topic, []).
addInterest([], Client, Topic, Result) ->
Result ++ [{Topic, [Client]}];
addInterest([{SelectedTopic, Clients}|T], Client, Topic, Result) ->
if SelectedTopic == Topic ->
NewClients = Clients ++ [Client],
Result ++ [{Topic, NewClients}] ++ T;
SelectedTopic =/= Topic ->
addInterest(T, Client, Topic, Result ++ [{SelectedTopic, Clients}])
end.
答案 0 :(得分:1)
我建议你:http://www.erlang.org/doc/getting_started/conc_prog.html
无论如何,假设您所有节点共享相同的cookie,则启动3个不同的shell
erl -sname n1
(n1@ubuntu)1> pubsub2:startClient().
erl -sname n2
(n1@ubuntu)1> pubsub2:startDispatcher().
erl -sname n3
(n1@ubuntu)1> pubsub2:startClient().
n1中的执行:
(n1@ubuntu)1> pubsub2:startClient().
(n1@ubuntu)2> pubsub2:subscribe('n2@ubuntu', football).
n3中的执行:
(n3@ubuntu)1> pubsub2:startClient().
(n3@ubuntu)1> pubsub2:publish('n2@ubuntu', football, news1).
在Received message news1 for topic football
当然,您可以根据需要进行扩展。