• RabbitMQ 入门


    安装

    一、通过 docker 方式快速安装

    # 最新的 RabbitMQ 3.10
    docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.10-management

    然后浏览器打开链接

    http://localhost:15672 

    默认账号密码都为 guest,安全起见,最好进行修改,而且这个默认的账户只作用于本地,推荐的做法是:删除默认用户、使用新的安全凭证创建新的用户

    添加新账户的方式:

    1. 通过 web 管理界面

    2. 命令行

    # 添加用户  rabbitmqctl add_user {username} {password}
    rabbitmqctl add_user admin 123456
     
    #修改用户密码 rabbitmqctl change_password {username} {newpassword}
    rabbitmqctl change_password admin 123456
     
    #验证用户密码
    rabbitmqctl authenticate_user admin 123456
     
    #删除用户
    rabbitmqctl delete_user admin
     
    #列出用户
    rabbitmqctl list_users
     
    # 给用户设置标签 none management monitoring administrator 多个用,分隔
    #rabbitmqctl set_user_tags {username} {tag ...}
    rabbitmqctl set_user_tags admin administrator

    给用户授权

    #rabbitmqctl set_permissions [-p host] {user} {conf} {write} {read}
    #vhost 授予用户访问权限的vhost名称 默认 /
    #user 可以访问指定vhost的用户名
    #conf 一个用于匹配用户在那些资源上拥有可配置的正则表达式
    #write 一个用于匹配用户在那些资源上拥有可写的正则表达式
    #read 一个用于匹配用户在那些资源上拥有可读的正则表达式
     
    #授予admin用户可访问虚拟主机testhost,并在所有的资源上具备可配置、可写及可读的权限
    rabbitmqctl set_permissions -p /testhost admin ".*" ".*" ".*"
     
    #授予admin用户可访问虚拟主机testhost1,在以queue开头的资源上具备可配置权限、并在所有的资源上可写及可读的权限
    rabbitmqctl set_permissions -p /testhost1 admin "^queue.*" ".*" ".*"
     
    #清除权限
    rabbitmqctl clear_permissions -p /testhost admin
     
    #虚拟主机的权限
    rabbitmqctl list_permissions -p /testhost
     
    #用户权限
    rabbitmqctl list_user_permissions admin

    vhost操作

    #添加vhost
    rabbitmqctl add_vhost /testhost
     
     
    #列出vhost
    rabbitmqctl list_vhosts
     
    #删除vhost
    rabbitmqctl delete_vhost /testhost

    二、MAC OS 安装

    在 Mac 下安装RabbitMQ是非常简单的,一般默认 RabbitMQ 服务器依赖的 Erlang 已经安装,只需要用下面两个命令就可以完成 RabbitMQ 的安装(前提是 homebrew 已经被安装):

    brew update
    brew install rabbitmq

    安装完成后需要将/usr/local/sbin添加到$PATH,可以将下面这两行加到~/.bash_profile:

    vim ~/.bash_profile
    # RabbitMQ Config
    export PATH=$PATH:/usr/local/sbin

    保留后执行

    source ~/.bash_profile

    启动服务后,就可以跟上面一样输入 localhost:15672 去访问了

    rabbitmq-server

    什么是AMQP?

    AMQP:即Advanced Message Queuing Protocol,是一个应用层标准高级消息队列协议,提供统一消息服务。是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品、不同的开发语言等条件的限制。

     

    使用场景

     

    几个基础概念:交换器 exchange、绑定 bindings、队列 queue

    Exchange 的类型:

    • direct 根据路由键进行完全匹配

    • fanout 广播的方式同时被传送给所有绑定的队列

    • topic 路由key为一个表达式,routingKey表达式必须使用点隔开的任意多个英文单词,:表示一个英文单词位置,#:表示任意多个单词文字,如:“delete.” 表示有两个单词,以delete开始的匹配字符串:delete.aaa,delete.bbb,“#.update”表示以update结尾的所有匹配字符串:aaa.update,aaa.bbb.update

    vhost 虚拟主机

    vhost 之间是逻辑上的隔离,同时也避免迁移的同名问题,类型程序里面的命名空间,是一种多租户模式

    消息持久化:

    • 消息的 Delivery mode 设置为 2

    • 发送到持久化的 exchange(设置 Durability 为 Durable)

    • 到达持久化的 queue(设置 Durability 为 Durable)

    持久化日志的缺点:性能降低10倍

     

    常见的MQ产品

    • RabbitMQ
    • ActiveMQ
    • RocketMQ
    • Kafka

     一、RabbitMQ

    优点:

    1. 由于 erlang 语言的特性,mq 性能较好,高并发;

    2. 健壮稳定、易用、跨平台、支持多种语言、文档齐全;

    3. 有消息确认机制和持久化机制,可靠性高;

    4. 高度可定制的路由;

    5. 管理界面较丰富,在互联网公司也有较大规模的应用;

    6. 社区活跃度高;

    缺点:

    1. 尽管结合 erlang 语言本身的并发优势,性能较好,但是不利于做二次开发和维护;

    二、ActiveMQ

    ActiveMQ是由Apache出品,ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。

    优点:

    1. 跨平台(JAVA编写与平台无关有,ActiveMQ几乎可以运行在任何的JVM上)
    2. 可以用JDBC:可以将数据持久化到数据库。虽然使用JDBC会降低ActiveMQ的性能,但是数据库一直都是开发人员最熟悉的存储介质。将消息存到数据库,看得见摸得着。而且公司有专门的DBA去对数据库进行调优,主从分离;
    3. 支持JMS :支持JMS的统一接口;
    4. 支持自动重连;
    5. 有安全机制:支持基于shiro,jaas等多种安全配置机制,可以对Queue/Topic进行认证和授权。
    6. 监控完善:拥有完善的监控,包括Web Console,JMX,Shell命令行,Jolokia的REST API;
    7. 界面友善:提供的Web Console可以满足大部分情况,还有很多第三方的组件可以使用,如hawtio;

    缺点:

    1. 社区活跃度不及RabbitMQ高;
    2. 根据其他用户反馈,会出莫名其妙的问题,会丢失消息;
    3. 目前重心放到activemq6.0产品-apollo,对5.x的维护较少;
    4. 不适合用于上千个队列的应用场景;

    三、RocketMQ

    RocketMQ 是一个分布式消息和流数据平台,具有低延迟、高性能、高可靠性、万亿级容量和灵活的可扩展性。RocketMQ是2012年阿里巴巴开源的第三代分布式消息中间件,2016年11月21日,阿里巴巴向Apache软件基金会捐赠了RocketMQ;第二年2月20日,Apache软件基金会宣布Apache RocketMQ成为顶级项目。

    优点:

    1. 单机支持 1 万以上持久化队列
    2. RocketMQ 的所有消息都是持久化的,先写入系统 PAGECACHE,然后刷盘,可以保证内存与磁盘都有一份数据, 
    3. 访问时,直接从内存读取。
    4. 模型简单,接口易用(JMS 的接口很多场合并不太实用);
    5. 性能非常好,可以大量堆积消息在broker中;
    6. 支持多种消费,包括集群消费、广播消费等。
    7. 各个环节分布式扩展设计,主从HA;
    8. 开发度较活跃,版本更新很快。

    缺点:

    1. 支持的客户端语言不多,目前是java及c++,其中c++不成熟;
    2. RocketMQ社区关注度及成熟度也不及前两者;
    3. 没有web管理界面,提供了一个CLI(命令行界面)管理工具带来查询、管理和诊断各种问题;
    4. 没有在 mq 核心中去实现JMS等接口;

    四、Kafka

    Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。

    主要应用场景是:日志收集系统和消息系统。

     优点:
    1. 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
    2. 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
    3. 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
    4. 同时支持离线数据处理和实时数据处理。
    5. Scale out:支持在线水平扩展

    缺点:

    1. Kafka单机超过64个队列/分区,Load会发生明显的飙高现象,队列越多,load越高,发送消息响应时间变长
    2. 使用短轮询方式,实时性取决于轮询间隔时间;
    3. 消费失败不支持重试;
    4. 支持消息顺序,但是一台代理宕机后,就会产生消息乱序;
    5. 社区更新较慢;

    总结:

    Kafka在于分布式架构,RabbitMQ基于AMQP协议来实现,RocketMQ/思路来源于kafka,改成了主从结构,在事务性可靠性方面做了优化。广泛来说,电商、金融等对事务性要求很高的,可以考虑RabbitMQ和RocketMQ,对性能要求高的可考虑Kafka。

    官方文档:

    https://www.rabbitmq.com/download.html

    参考链接:

    https://www.cnblogs.com/ZhuChangwu/p/14093107.html#%E6%8C%87%E5%AE%9Arabbitmq%E7%9A%84%E5%90%AF%E5%8A%A8%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6

  • 相关阅读:
    用SQL实现的一个自动排课机制
    如何读懂复杂的C声明
    Mingw32配置
    test
    HttpSession API
    java程序逻辑控制
    方法的定义及使用
    memcached 安装及集成(转)
    cookie和session的的区别以及使用示例?
    构造方法和普通方法的区别?
  • 原文地址:https://www.cnblogs.com/ryanzheng/p/16357712.html
Copyright © 2020-2023  润新知