ruby - rabbitmq, bunny 与 amqp 入门 快速入门, 1小时吧.
访问量: 2601
rabbitmq: 是消息处理服务器. https://www.rabbitmq.com
amqp: advanced message queue protocel . 有各种语言的实现, 包括ruby的. https://github.com/ruby-amqp/amqp
bunny: 对 ruby-amqp 的封装, 让其对rabbitmq的使用更加方便. https://github.com/ruby-amqp/bunny
rabbitmq的安装:
参考: https://www.rabbitmq.com/install-debian.html
sudo apt-add-repository 'deb http://www.rabbitmq.com/debian/ testing main' curl http://www.rabbitmq.com/rabbitmq-signing-key-public.asc | sudo apt-key add - # 安装 sudo apt-get update sudo apt-get install rabbitmq-server # 启动服务器 sudo rabbitmq-plugins enable rabbitmq_management sudo service rabbitmq-server restart # 安装rabbitmqadmin wget http://localhost:15672/cli/rabbitmqadmin chmod +x rabbitmqadmin sudo mv rabbitmqadmin /usr/local/sbin
远程访问相关
希望远程可以访问:(使用用户 sg552 , 密码:sg552)
rabbitmqctl add_user sg552 sg552 rabbitmqctl set_user_tags sg552 administrator rabbitmqctl set_permissions -p / sg552 ".*" ".*" ".*"
查看当前rabbitmq 版本: $ sudo rabbitmqctl status
结果中的: {rabbit,"RabbitMQ","2.6.1"}, 就是。
远程访问的命令:
rabbitmqadmin -H 10.140.0.2 -P 15672 -u sg552 -p sg552 list vhosts
(注意: > 3.3 以后,远程访问的端口是 15672, 这里有个精彩的文章:https://stackoverflow.com/questions/12792856/what-ports-does-rabbitmq-use 但是我们在真实的测试当中,还是需要使用5672的。 )
这个东东跟 cache server 一样 . 类似于: memcached. 都是底层的服务.
也类似于数据库, exchange就是 table, queue 就是 row(一条记录)
我们可以使用命令行来查看:
$ 登陆 , 跟mysql 一样. $ rabbitmqadmin -H localhost -u guest -p guest list vhosts +------+----------+ | name | messages | +------+----------+ | / | 32 | +------+----------+ (注意, 默认的用户名和密码都是guest , 可以在启动的时候进行配置) 如果输错了用户名和密码, 会看到: *** Access refused: /api/vhosts?columns=name,messages 下面,是列出所有的 exchanges: $ rabbitmqadmin list exchanges +---------------------+---------+ | name | type | +---------------------+---------+ | nba.score | fanout | +---------------------+---------+ 可以看出, rabbitmq 保存消息 跟mysql是差不多的. 类似于数据库. fanout: 最简单的模式, 像风扇一样出去. (传递给所有人) direct: 传递给某个人. (具备对应的routing key ) topic: 把内容传递给关心这个话题的人. (例如: 发送天气消息,给所有关心 weather的人) 具体的解释参考: https://blog.csdn.net/chendaoqiu/article/details/48440633 也可以只列出几个列: $ rabbitmqadmin list queues name node messages +-----------------------------+-------------------+----------+ | name | node | messages | +-----------------------------+-------------------+----------+ | aaron | rabbit@instance-2 | 0 | | bob | rabbit@instance-2 | 0 | | joe | rabbit@instance-2 | 0 |
$
一个非常简单的例子:
require "rubygems" require "bunny" STDOUT.sync = true # 链接 rabbit mq 服务器 conn = Bunny.new("amqp://guest:guest@localhost:5672") conn.start ch = conn.create_channel x = ch.fanout("nba.scores") # 开始 入队 ch.queue("joe", :auto_delete => true).bind(x).subscribe do |delivery_info, metadata, payload| puts "#{payload} => joe" end ch.queue("aaron", :auto_delete => true).bind(x).subscribe do |delivery_info, metadata, payload| puts "#{payload} => aaron" end ch.queue("bob", :auto_delete => true).bind(x).subscribe do |delivery_info, metadata, payload| puts "#{payload} => bob" end # 发送消息. 所有人都会听到. x.publish("BOS 101, NYK 89").publish("ORL 85, ALT 88") 运行到这里就会出现结果: conn.close