• rabbitmq在linux下单节点部署和基本使用


        RabbitMQ是基于erlang开发的消息服务,官网为:https://www.rabbitmq.com,RabbitMQ要依赖erlang运行,所以要先安装erlang环境,rabbitmq可以用rpm或通用二进制包安装,这里使用二进制包的方式安装,版本为3.8.1,对应的erlang版本为22.1,注意版本的对应关系,如果相差太大可能会无法启动服务,rabbit和erlang的版本对应关系参考:https://www.rabbitmq.com/which-erlang.html

        首先安装erlang,在centos下使用yum安装的erlang版本太低,rabbitmq无法启动,这里使用编译源码的方式安装,参考文档为:https://github.com/erlang/otp/blob/maint/HOWTO/INSTALL.md,文档写的很详细,erlang包下载地址:https://www.erlang.org/downloads,这里下载的包为:otp_src_22.1.tar.gz,安装之前注意下面的一些必要环境:

        1. GNU make,这个一般机器都有

        2. gcc编译环境,这里用的4.8版本

        3. Perl 5,默认是5.16

        4. ncurses-devel开发包,安装命令: yum install ncurses-devel 

        5. sed命令,几乎所有linux系统都有

        6. openssl开发包,版本要大于0.9.8,安装命令: yum install openssl-devel 

        基本上上面这些就够了,其他的都是一些附加的扩展或者编译文档用到的,具体组件参考上面的安装链接页面

        执行下面的命令解压erlang源码:

    tar -xvzf otp_src_22.1.tar.gz
    cd otp_src_22.1/
    export ERL_TOP=`pwd`

        开始编译源码,安装目录设置为:/usr/local/erlang

    ./configure --prefix=/usr/local/erlang
    make
    make install

        现在erlang就安装到/usr/local/erlang了,这时候要配置环境变量方便直接调用erl命令,导入变量命令: export PATH=$PATH:/usr/local/erlang/bin ,可以将这条指令添加到profile配置文件然后source永久生效,添加变量后执行erl如果正常进入提示符说明环境可以了:

        

        然后下一步开始安装rabbitmq,这里安装包的名称为:rabbitmq-server-generic-unix-3.8.1.tar.xz,需要先用xz命令进行解压:

    xz -d rabbitmq-server-generic-unix-3.8.1.tar.xz
    tar -xvf rabbitmq-server-generic-unix-3.8.1.tar

        执行之后当前目录下会解压出来rabbitmq_server-3.8.1这个目录,直接移动到安装的位置即可,比如: mv rabbitmq_server-3.8.1 /usr/local 将rabbitmq安装到/usr/local/下,在rabbitmq服务启动前可以手动去调整系统最大文件数等参数来优化mq的性能,具体参考:https://www.rabbitmq.com/install-generic-unix.html,同样为了方便可以将/usr/local/rabbitmq_server-3.8.1/sbin目录添加到环境变量

        其实现在已经可以启动服务了,目前参数都是默认的,要配置自定义参数还缺少一个配置文件,这里配置文件默认位置为:/usr/local/rabbitmq_server-3.8.1/etc/rabbitmq/rabbitmq.conf,这个文件不存在需要手动创建,具体的配置示例参考:https://github.com/rabbitmq/rabbitmq-server/blob/master/docs/rabbitmq.conf.example,现在可以将配示例全部复制到新建的配置文件中,也就是安装目录下的etc/rabbitmq/rabbitmq.conf,比如端口号默认是5672,我们可以修改为5682,配置项为:listeners.tcp.default,如下:

       

        更多配置参考:https://www.rabbitmq.com/configure.html,然后可以启动rabbitmq服务了,命令如下:

        前台启动: ./sbin/rabbitmq-server  

        后台启动: ./sbin/rabbitmq-server -detached 

        停止服务: sbin/rabbitmqctl shutdown 

        启动服务之后可以测试一下消息队列方式是不是好用,这是使用python pika模块,生产消息代码如下:new_task.py

    #!/usr/bin/env python
    import pika
    import sys
    
    connection = pika.BlockingConnection(
        pika.ConnectionParameters(host='localhost', port=5682))
    channel = connection.channel()
    
    channel.queue_declare(queue='task_queue', durable=True)
    
    for i in range(100):
        message = '%d. Hello!' % i
        channel.basic_publish(
            exchange='',
            routing_key='task_queue',
            body=message,
            properties=pika.BasicProperties(
                delivery_mode=2,  # make message persistent
            ))
        print("Queue sent %r" % message)
    connection.close()

        消费消息代码如下:worker.py

    #!/usr/bin/env python
    import pika
    import time
    
    connection = pika.BlockingConnection(
        pika.ConnectionParameters(host='localhost',port=5682))
    channel = connection.channel()
    
    channel.queue_declare(queue='task_queue', durable=True)
    print(' [*] Waiting for messages. To exit press CTRL+C')
    
    
    def callback(ch, method, properties, body):
        print("Received %r" % body)
        #time.sleep(body.count(b'.'))
        #print("Done")
        ch.basic_ack(delivery_tag=method.delivery_tag)
    
    
    channel.basic_qos(prefetch_count=1)
    channel.basic_consume(queue='task_queue', on_message_callback=callback)
    channel.start_consuming()

        这两段代码就是官网上给出的work queues示例代码,首先启动消费的脚本,这里开两个窗口分别执行python3 worker.py,启动后应该是阻塞的,然后再启动生产消息的脚本python3 new_task.py,我这里用的是python3,具体根据自己的环境执行,执行后如果生产消息正常退出并且两个worker分别输出不一样序号的消息,也就是说生产的消息被分割到两个进程处理,每个进程消费到数据都不重复,这样的话说明测试通过,服务是正常的

        实际上rabbitmq支持5种不同的消息模型,可以根据不同的场景来应用,这几种消息模型如下:

        

         

        这里只是简单叙述了rabbitmq非常初级的应用,更深入的后续再补充. 

  • 相关阅读:
    玲珑杯 1035 D-J
    多项式exp
    Thanks to World
    【uoj#191.】Unknown
    【bzoj4534】基础排序算法练习题
    【bzoj4596】黑暗前的幻想乡
    【bzoj2893】征服王
    【bzoj3876】支线剧情
    【bzoj4283】魔法少女伊莉雅
    【bzoj1822】冷冻波
  • 原文地址:https://www.cnblogs.com/freeweb/p/11819848.html
Copyright © 2020-2023  润新知