消息队列MQ

rabbitmq 初探

本文主要是介绍rabbitmq 初探,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

启动服务端

  • 官方教程
  • 官方没有给出 docker-compose 脚本, 那么我就自己搞一个

docker-compose 启动

  • 官方命令: docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management
  • docker-compose脚本
    version: '3.9'
    # cmd: docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management
    rabbitmq:
      image: rabbitmq:3.9-management
      container_name: rabbitmq
      ports:
        - 5672:5672
        - 15672:15672
    
  • 执行 docker-compsoe up rabbitmq 启动

跑一下

  • 官方教程
  • 繁琐的文字大家使用 google 翻译自行查看

使用 python

初始化环境

  • 安装pip包: pika, pip install pika
  • PS: 官方给出的是: python -m pip install pika --upgrade, 但是使用该命令不但很慢,而且会失败。

连接测试

  • 将如下代码加入 send.py
    #!/usr/bin/python3
    import pika
    
    # 初始化链接
    # PS: 因为我这里是在 docker for mac 环境中运行的, host.docker.internal 代表本机
    # PS2: 如果不理解上一句, 则无关紧要, 将下面的 host.docker.internal 替换为 localhost 即可
    connection = pika.BlockingConnection(pika.ConnectionParameters('host.docker.internal'))
    
    # 获取 channel, 应该是频道的意思
    channel = connection.channel()
    
  • 运行 chmod +x send.py 赋予 send.py 执行权限, 后面就可以使用 ./send.py 直接执行 python 脚本
  • 运行 ./send.py 未报错, 则表示链接成功

发送消息

  • 根据官方文档, 补充代码, 此时 send.py 则如下
    #!/usr/bin/python3
    import pika
    
    # 初始化链接
    # PS: 因为我这里是在 docker for mac 环境中运行的, host.docker.internal 代表本机
    # PS2: 如果不理解上一句, 则无关紧要, 将下面的 host.docker.internal 替换为 localhost 即可
    connection = pika.BlockingConnection(pika.ConnectionParameters('host.docker.internal'))
    
    # 获取 channel, 应该是频道的意思
    channel = connection.channel()
    
    # 声明一个队列, declare 意思是声明
    channel.queue_declare(queue='hello')
    
    # 将 "Hello World!" 推送到 名为 "hell" 的 队列
    channel.basic_publish(exchange='',
                          routing_key='hello',
                          body='Hello World!')
    # 输出内容, 一般 [ ] xxx, 表示 xxx 未完成, 而 [x] xxx 则表示 xxx 已完成
    # 这里输出该内容表示 已经将 "Hello World!" 发送。
    print(" [x] Sent 'Hello World!'")
    
    # 关闭连接
    connection.close()
    
    
  • 运行 ./send.py 得到如下输出, 则表示消息入队成功
    [x] Sent 'Hello World!'
    

接收消息

  • 根据官方文档, 将如下代码写入 receive.py 文件
    #!/usr/bin/python3
    import pika, sys, os
    
    def main():
        # 这里写为 host.docker.internal 的原因查看 send.py
        connection = pika.BlockingConnection(pika.ConnectionParameters(host='host.docker.internal'))
        channel = connection.channel()
    
        # 声明一个名为 "hello" 的 队列
        channel.queue_declare(queue='hello')
    
        # 队列回调函数, 将 接收到的消息 输出到控制台
        def callback(ch, method, properties, body):
            print(" [x] Received %r" % body)
    
        # 为队列配置监听方式, 即: 当队列中有数据的时候, 调用回调函数
        channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)
    
        # 输出信息, 告诉调用者使用 "ctrl+c" 快捷键停止监听
        print(' [*] Waiting for messages. To exit press CTRL+C')
    
        # 开始监听队列
        channel.start_consuming()
    
    if __name__ == '__main__':
        """启动 main 函数
        
        当按下 ctrl+c 后停止运行
        """
        try:
            main()
        except KeyboardInterrupt:
            print('Interrupted')
            try:
                sys.exit(0)
            except SystemExit:
                os._exit(0)
    
  • 执行 chmod +x receive.pyreceive.py 赋予执行权限, 方便后面调用
  • 执行 ./receive.py 可以得到如下输出
    [*] Waiting for messages. To exit press CTRL+C
    [x] Received b'Hello World!'
    

输出解读

  • [*] Waiting for messages. To exit press CTRL+C 是 print 的内容
  • [x] Received b'Hello World!' 是回调函数输出的内容, 看到此输出, 表示已经从 rabbitmq 的队列中读取到了数据

发送&&接收

  • 运行 ./receive.py 开始接收消息(PS: 如果之前已经运行了还没有关闭, 那就可以不运行)
  • 新建命令行运行 ./send.py
  • 仔细观察, 可以发现 每次运行 ./send.py, 都可以在 ./receive.py 中看到一个 [x] Received b'Hello World!' 的输出
  • 自此, 已经初步掌握了 rabbit 的 入队, 出队 的操作
这篇关于rabbitmq 初探的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!