你好 rabbitmq
一、重要概念理解:AMQP协议, 生产者,消息队列,发布订阅,路由,交换机,消费者,消息确认
- (Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议,是一个使用 TCP 提供可靠投递的应用层协议。
- 交换机类型:
注意:Default:自动命名的直交换机
- 路由 routing_key,:
1
.扇型交换机以广播形式处理消息,所以会忽略routing_key;2
.直连交换机则是严格意义上的匹配,换言之 Routing Key 必须与 Binding Key 相匹配的时候才将消息传送给 Queue;3
.而主题交换机则是模糊匹配Routing Key(一个句点号 “.” 分隔的字符串),通过通配符满足一部分规则就可以传送,如 “” 与“#”,用于做模糊匹配,其中 “” 用于匹配一个单词,“#”用于匹配多个单词;4
.头交换机不依赖于 routing key 与 binding key 的匹配规则来路由消息,而是根据发送的消息内容中的 headers 属性进行匹配,可以视为直连交换机的另一种表现形式, header头携带的 “x-match” 参数。当 “x-match” 设置为 “any” 时,消息头的任意一个值被匹配就可以满足条件,而当 “x-match” 设置为 “all” 的时候,就需要消息头的所有值都匹配成功 - 消息确认:消费者确认消息消费了之后的反馈
- 队列queue: Name 名称 Durable(消息代理重启后,队列存储在磁盘)Exclusive(一个连接(connection)关闭后队列即被删除)Auto-delete(当最后一个消费者退订后即被删除)Arguments
- AMQPMessage对象属性:
‘content_type’ => ‘shortstr’,
‘content_encoding’ => ‘shortstr’,
‘application_headers’ => ‘table_object’,
‘delivery_mode’ => ‘octet’,
‘priority’ => ‘octet’,
‘correlation_id’ => ‘shortstr’,
‘reply_to’ => ‘shortstr’,
‘expiration’ => ‘shortstr’,
‘message_id’ => ‘shortstr’,
‘timestamp’ => ‘timestamp’,
‘type’ => ‘shortstr’,
‘user_id’ => ‘shortstr’,
‘app_id’ => ‘shortstr’,
‘cluster_id’ => ‘shortstr’,
二、配置文件重要字段:
listeners.tcp.default = 5672
handshake_timeout = 10000
disk_free_limit.absolute = 50MB
disk_free_limit.relative = 3.0
vm_memory_high_watermark.relative = 0.6
vm_memory_high_watermark.absolute = 2 GB
vm_memory_high_watermark_paging_ratio = 0.5
log.file.level =info(error|warning|debug)
channel_max = 2047 (0无限制)
max_message_size(134217728到536870912)
heartbeat = 60
default_vhost = /
default_user = guest
default_pass = guest
default_permissions.configure =.*
default_permissions.read =.*
default_permissions.write =.*
proxy_count = 16
cluster_keepalive_interval = 10000
queue_index_embed_msgs_below = 4096
//高级部分
{rabbit, [
{msg_store_file_size_limit, 16777216},
{queue_index_max_journal_entries,32768 }
]}
四、代码部分(php为例)
1、发送者
$connect = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connect->channel();
//声明交换机 logs
$channel->exchange_declare('logs', 'direct', false, true, false);
$msg = new AMQPMessage('this is log contents that your writes');
//发布
$channel->basic_publish($msg, 'logs');
$channel->close();
$connect->close();
2、消费者
$connect = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connect->channel();
$channel->exchange_declare('logs', 'direct', false, false, false);
list($queue_name, ,) = $channel->queue_declare("", false, false, false, false);
$channel->queue_bind($queue_name, 'logs', 'routing_key'); //交换机是扇形讲忽略‘routing_key’
$callback = function ($msg) {
echo ' [x] ', $msg->body, "\n";
};
$channel->basic_consume($queue_name, '', false, true, false, false, $callback);
while ($channel->is_open()) {
$channel->wait();
}
/$channel->close();
$connect->close();