我已经为eJabberd编写了一些扩展模块,其中大部分都是出于各种原因将信息传递给RabbitMQ。一切都很好,直到我们把服务器带到了我们有一个Rabbit集群而不是一个盒子的阶段。
为了利用群集,您需要使用“all”或“nodes”值将“x-ha-policy”参数传递给Rabbit。这适用于Java和Python生产者和消费者,但eJabberd(当然使用Erlang AMQP客户端)让我有点难过。需要将x-ha-policy参数传递给“client_properties”参数,该参数只是额外参数的“catchall”。
在Python中使用鼠兔我可以做到:
client_params = {"x-ha-policy": "all"}
queue.declare(host, vhost, username, password, arguments=client_params)
这是有效的。但是,Erlang客户端的文档说,参数应该作为列表传递:
[{binary(), atom(), binary()}]
如果它只是[{binary(),binary()}]我可以看到与键/值的关系,但不知道原子会在那里。
为了清楚起见,我是Erlang的新手程序员,所以这可能是一个我不熟悉的常见结构,所以答案不会太明显。
答案 0 :(得分:2)
我在amqp_network_connection.erl
中找到了这个,它看起来像是一个设置默认值的包装器:
client_properties(UserProperties) ->
{ok, Vsn} = application:get_key(amqp_client, vsn),
Default = [{<<"product">>, longstr, <<"RabbitMQ">>},
{<<"version">>, longstr, list_to_binary(Vsn)},
{<<"platform">>, longstr, <<"Erlang">>},
{<<"copyright">>, longstr,
<<"Copyright (c) 2007-2012 VMware, Inc.">>},
{<<"information">>, longstr,
<<"Licensed under the MPL. "
"See http://www.rabbitmq.com/">>},
{<<"capabilities">>, table, ?CLIENT_CAPABILITIES}],
lists:foldl(fun({K, _, _} = Tuple, Acc) ->
lists:keystore(K, 1, Acc, Tuple)
end, Default, UserProperties).
显然,atom描述了值类型。我不知道可用的类型,但longstr
可能适用于您的情况。