查看rabbitmq版本命令 3.6x 对应什么版本 erlang

主要功能使用
关于RabbitMQ erlang client的使用说明可以参考。这个client library下载下来后是两个ez文件,其实就是zip文件,本身是erlang支持的库打包格式,但据说这个feature还不成熟。总之我是直接解压,然后在环境变量中指定ERL_LIBS到解压目录。使用时使用include_lib包含库文件(类似C语言里的头文件):
-include_lib("amqp_client/include/amqp_client.hrl").
Connection/Channel
对于连接到本地的RabbitMQ服务:
{ok, Connection} = amqp_connection:start(#amqp_params_network{}),
{ok, Channel} = amqp_connection:open_channel(Connection),
每个Queue都有名字,这个名字可以人为指定,也可以由系统分配。Queue创建后如果不显示删除,断开网络连接是不会自动删除这个Queue的,这个可以在RabbitMQ的web管理端看到。
#'queue.declare_ok'{queue = Q}
= amqp_channel:call(Channel, #'queue.declare'{queue = &&"rpc_queue"&&}),
但也可以指定Queue会在程序退出后被自动删除,需要指定exclusive参数:
QDecl = #'queue.declare'{queue = &&&&, exclusive = true},
#'queue.declare_ok'{queue = Q} = amqp_channel:call(Channel, QDecl),
上例中queue的名字未指定,由系统分配。
一般情况下,消息其实是发送给exchange的:
Payload = &&"hello"&&
Publish = #'basic.publish'{exchange = &&"log_exchange"&&},
amqp_channel:cast(Channel, Publish, #amqp_msg{payload = Payload}),
exchange有一系列规则,决定某个消息将被投递到哪个队列。
发送消息时也可以不指定exchange,这个时候消息的投递将依赖于routing_key,routing_key在这种场景下就对应着目标queue的名字:
#'queue.declare_ok'{queue = Q}
= amqp_channel:call(Channel, #'queue.declare'{queue = &&"rpc_queue"&&}),
Payload = &&"hello"&&,
Publish = #'basic.publish'{exchange = &&&&, routing_key = Q},
amqp_channel:cast(Channel, Publish, #amqp_msg{payload = Payload}),
可以通过注册一个消息consumer来完成消息的异步接收:
Sub = #'basic.consume' {queue = Q},
#'basic.consume_ok'{consumer_tag = Tag} = amqp_channel:subscribe(Channel, Sub, self()),
以上注册了了一个consumer,监听变量Q指定的队列。当有消息到达该队列时,系统就会向consumer进程对应的mailbox投递一个通知,我们可以使用receive来接收该通知:
loop(Channel) -&
% This is the first message received (from RabbitMQ)
#'basic.consume_ok'{} -&
loop(Channel);
% a delivery
{#'basic.deliver'{delivery_tag = Tag}, #amqp_msg{payload = Payload}} -&
echo(Payload),
% ack the message
amqp_channel:cast(Channel, #'basic.ack'{delivery_tag = Tag}),
loop(Channel);
绑定exchange和queue
绑定(binding)其实也算AMQP里的一个关键概念,它用于建立exchange和queue之间的联系,以方便exchange在收到消息后将消息投递到队列。我们不一定需要将队列和exchange绑定起来。
Binding = #'queue.bind'{queue = Queue, exchange = Exchange, routing_key = RoutingKey},
#'queue.bind_ok'{} = amqp_channel:call(Channel, Binding)
在绑定的时候需要填入一个routing_key的参数,不同类型的exchange对该值的处理方式不一样,例如后面提到fanout类型的exchange时,就不需要该值。
通过阅读,我们还会获得很多细节信息。例如exchange的种类、binding等。
exchange分类
exchange有四种类型,不同类型决定了其在收到消息后,该如何处理这条消息(投递规则),这四种类型为:
fanout类型的exchange是一个广播exchange,它在收到消息后会将消息广播给所有绑定到它上面的队列。绑定(binding)用于将队列和exchange关联起来。我们可以在创建exchange的时候指定exchange的类型:
Declare = #'exchange.declare'{exchange = &&"my_exchange"&&, type = &&"fanout"&&}
#'exchange.declare_ok'{} = amqp_channel:call(Channel, Declare)
direct类型的exchange在收到消息后,会将此消息投递到发送消息时指定的routing_key和绑定队列到exchange上时的routing_key相同的队列里。可以多次绑定一个队列到一个exchange上,每次指定不同的routing_key,就可以接收多种routing_key类型的消息。注意,绑定队列时我们可以填入一个routing_key,发送消息时也可以指定一个routing_key。
topic类型的exchange相当于是direct exchange的扩展,direct exchange在投递消息到队列时,是单纯的对routing_key做相等判定,而topic exchange则是一个routing_key的字符串匹配,就像正则表达式一样。在routing_key中可以填入一种字符串匹配符号:
* (star) can substitute for exactly one word.
# (hash) can substitute for zero or more words.
header exchange tutorial中未提到,我也不深究
消息投递及回应
每个消息都可以提供回应,以使RabbitMQ确定该消息确实被收到。RabbitMQ重新投递消息仅依靠与consumer的网络连接情况,所以只要网络连接正常,consumer卡死也不会导致RabbitMQ重投消息。如下回应消息:
amqp_channel:cast(Channel, #'basic.ack'{delivery_tag = Tag}),
其中Tag来源于接收到消息时里的Tag。
如果有多个consumer监听了一个队列,RabbitMQ会依次把消息投递到这些consumer上。这里的投递原则使用了round robin方法,也就是轮流方式。如前所述,如果某个consumer的处理逻辑耗时严重,则将导致多个consumer出现负载不均衡的情况,而RabbitMQ并不关心consumer的负载。可以通过消息回应机制来避免RabbitMQ使用这种消息数平均的投递原则:
Prefetch = 1,
amqp_channel:call(Channel, #'basic.qos'{prefetch_count = Prefetch})
消息可靠性
RabbitMQ可以保证消息的可靠性,这需要设置消息和队列都为durable的:
#'queue.declare_ok'{queue = Q} = amqp_channel:call(Channel, #'queue.declare'{queue = &&"hello_queue"&&, durable = true}),
Payload = &&"foobar"&&,
Publish = #'basic.publish'{exchange = "", routing_key = Queue},
Props = #'P_basic'{delivery_mode = 2}, %% persistent message
Msg = #amqp_msg{props = Props, payload = Payload},
amqp_channel:cast(Channel, Publish, Msg)
除了参考RabbitMQ tutorial外,还可以看看别人使用erlang是如何实现这些tutorial的,github上有一个这样的项目:。我自己也实现了一份,包括rabbitmq-tutorials中没实现的RPC。后来我发现原来的实现里已经包含了一个RPC模块。<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&rabbitmq--安装后的通用配置与操作
rabbitmq的版本更新速度还是比较快的,从BUG的修复到内部实现的优化都有涉及,连命令和使用的方式也稍有变化,因此打算基于rabbitmq-3.3.5版本,重新学习下rabbitmq,并整理形成文档备忘。
网上有很多都介绍了rabbitmq的安装与配置,然而真正在配置部署的时候还得要临时翻看下相关的文档,比如需要在一台机器上部署rabbitmq的集群时,就会不断因为端口冲突而导致不能正常启动和运行。另外,从rabbitmq版本升级后使用方式的变更可能因为使用默认的配置而导致无法正常使用,因此有了这篇文章。
常用配置与操作
在rabbitmq-env.conf文件中,可以通过变量NODENAME对节点名进行设置。默认的节点名称为rabbit(实际上真正的节点名称为NODENAME@HOST ,NODENAME从配置文件中获取,HOST为该服务器的主机名)。例如,配置节点名为spurs:
NODENAME=spurs
请注意:"="前后无空格,另外,该文件需要手动创建。
用于客户端连接的侦听端口
修改这个侦听端口有两种方式,一种方式是在rabbitmq.config文件中,通过配置项tcp_listeners配置指定端口,如未进行配置,rabbitmq会使用默认的端口5672。例如,配置端口为5670
{rabbit, [{tcp_listeners, [5670]}]}
另一种方式是通过配置文件rabbitmq-env.conf中的变量NODE_PORT来设置侦听端口,例如:
NODENAME=spurs
NODE_PORT=5675
注意:如果两个文件中都进行了配置,rabbitmq会优先使用rabbtmq-env.conf中变量NODE_PORT的值作为真正的侦听端口。
用于集群通信的erlang节点侦听端口
3.3.0以前的版本,rabbitmq会选用一个随机的端口作为erlang节点的侦听端口,这个端口主要用于集群间的通信。如果需要指定侦听端口的话,可以在rabbitmq-env.conf文件中增加变量SERVER_START_ARGS来设置侦听端口或者端口范围。
例如设置侦听端口范围为5
SERVER_START_ARGS="-kernel inet_dist_listen_min 50000 -kernel inet_dist_listen_max 51000"
3.3.0及以后版本,rabbitmq做了些改动——固定了用于集群通信的侦听端口,默认为25672。可以通过上面提到的rabbitmq-env.conf配置文件中的NODE_PORT配置来指定侦听端口,rabbitmq启动时会在设置的侦听端口加20000(查看脚本rabbitmq-server可以看到这个加的动作)作为真正的侦听端口。
web侦听端口
rabbitmq安装完成后,一般会启用管理控制台插件方便使用和运维。rabbitmq也会相应的在一个端口上进行侦听用于http的访问,默认的侦听端口为15672,可以在rabbitmq.config中按需进行设置。例如:
{rabbitmq_management, [{listener, [{port, 60000}]}]}
rabbitmq在安装完成后仅提供guest账号,但是在3.3.0及以后版本里,处于安全方面的考虑,guest账号仅能通过本地(lo网口)进行访问,因此安装完成后,需要为使用者创建不同的用户账号,更多信息可参考rabbitmq——用户管理。
上述这些通常是rabbitmq安装完成后需要进行配置或执行的操作,这里未涉及功能相关的配置,监控相关的配置,后续整理相关功能的时候在逐一整理。
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.041 (s). 12 q(s)}

我要回帖

更多关于 rabbitmq版本 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信