未分类

RabbitMQ安装和基本概念

RabbitMQ

1、RabbitMQ消息队列

RabbitMQ是一个消息队列:用于接收和转发消息。

2、RabbitMQ安装

1| Mac安装

1
2
3
brew install rabbitmq

rabbitmq-server

2|Centos安装

  • 安装epel源-解决erlang依赖wxGTK

    1
    2
    3
    wget http://www.rpmfind.net/linux/centos/7.4.1708/extras/x86_64/Packages/epel-release-7-9.noarch.rpm

    yum install epel-release-7-9.noarch.rpm
  • 添加erlang仓库-支持最新版erlang

    1
    2
    3
    wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm

    rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
  • 安装erlang

    1
    2
    3
    4
    # yum install erlang			# 精简版

    # yum install esl-erlang # 完整版
    # 实际使用yum连网安装RabbitMQ时,会自动下载安装依赖,此步骤不进行,否则后期会引起冲突
  • 安装RabbitMQ

    1
    2
    3
    rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc

    yum install rabbitmq-server-3.7.2-1.el7.noarch.rpm
  • 启动Rabbit MQ

    1
    2
    systemctl enable rabbitmq-server
    systemctl start rabbitmq-server

    3|ubuntu安装

    • 添加erlang源
    1
    2
    wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
    dpkg -i erlang-solutions_1.0_all.deb
    • 安装erlang
    1
    2
    # apt install esl-erlang
    # 不进行实际安装
    • 安装rabbitmq
    1
    2
    3
    4
    5
    6
    7
    echo "deb https://dl.bintray.com/rabbitmq/debian xenial main" | sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list

    wget -O- https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc |
    sudo apt-key add -

    apt update
    apt install rabbitmq-server

3、RabbitMQ使用

http://blog.csdn.net/column/details/rabbitmq.html

问题:消息队列解决编程中的什么问题?或者不使用消息队列,可能存在哪些问题?

这个问题的答案比较复杂。这取决于软件系统的复杂性。如果软件系统是由单独的一个模块构成,那么引入消息队列毫无用处。只是为了复杂而复杂。消息队列真正发挥作用的地方在于多模块或多组件或多子系统之间的交互以及异步任务。模块之间的通信,可以直接调用API。但是这种调用在单机系统可用,但是模块之间的耦合性太强。多机器之间的通信可以使用socket通信,但是需要维护连接,编程难度较大。

总结起来,存在的问题大概有:

  • message的生产者和消费者如何维持连接,如果某方的连接中断,期间丢失的数据丢失了怎么办?
  • 如何降低生产者和消费者之间的耦合度?
  • 如何让优先级较高的消费者优先获取message?
  • 如何做到负载均衡?
  • 如何高效地将数据发送到相关的消费者?也就是说消费者如何接收不同类型的数据?
  • 如何进行扩展,甚至将消费者集群化?
  • 如何保证消费者接收了完整、正确的数据?

AMQP协议定义了解决这些问题的方案,RabbitMQ是一种具体实现。

生产者指任何产生数据的程序。

消费者指任何接收数据的程序。

 消息队列模型

queue:A queue is only bound by the host’s memory & disk limits, it’s essentially a large message buffer.

消息队列涉及的概念:

  • connection:建立client和server之间的连接
  • channel:建立在connection之上的逻辑连接
  • exchange:路由message,An exchange is a very simple thing. On one side it receives messages from producers and the other side it pushes them to queues.
  • queue:存储和分发message
  • bind:用于exchange和queue之间的绑定,可以理解为queue对某些message感兴趣

RabbitMQ包含两大部分:server和client。server充当broker,使用erlang实现,client是代码实现的重点,提供各种语言API。

RabbitMQ的核心理念是消息生产者不会直接将数据发送到队列。实际上,生产者只可以将数据发送到exchange。exchange主要做两件事:先从生产者接收数据,然后将数据推送到队列。exchange必须准确了解对接收到的数据进行什么操作。包括:是将数据推送到特定的队列,还是将数据推送到许多队列,或者干脆丢弃?这种操作取决于exchange的类型。RabbitMQ支持四种exchange:direct、topic、headers和fanout。

  • direct:
  • topic:
  • headers:
  • fanout:将任何message广播到exchange知道的队列

exchange和队列创建完成之后,exchange需要知道将数据发送到哪个队列,这里需要进行exchange和队列之间的绑定。

开启rabbitmq管理网页的方法:

1
2
3
4
rabbitmqctl start_app
rabbitmq-plugins enable rabbitmq_management
rabbitmqctl stop

rabbitmq添加用户

现添加admin,密码admin,管理员权限

1
2
3
4
rabbitmqctl add_user admin admin
rabbitmqctl list_users
rabbitmqctl set_user_tags admin administrator
rabbitmqctl list_users

添加成功后赋权限

1
rabbitmqctl set_permissions -p / myuser ".*" ".*" ".*"
分享到