RabbitMQ入门系列01----RabbitMQ简介

这篇具有很好参考价值的文章主要介绍了RabbitMQ入门系列01----RabbitMQ简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 为什么要用mq?

在介绍RabbitMQ之前,我们先来看下面一个电商项目的场景:

  • 商品的原始数据保存在数据库中,增删改查都在数据库中完成。
  • 搜索服务数据来源是索引库(Elasticsearch),如果数据库商品发生变化,索引库数据不能及时更新。
  • 商品详情做了页面静态化处理,静态页面数据也不会随着数据库商品更新而变化。

如果我们在后台修改了商品的价格,搜索页面和商品详情页显示的依然是旧的价格,这样显然不对。该如何解决?  

我们可能会想到这么做:

  • 方案1:每当后台对商品做增删改操作,同时修改索引库数据及更新静态页面。
  • 方案2:搜索服务和商品页面静态化服务对外提供操作接口,后台在商品增删改后,调用接口。 

 这两种方案都有个严重的问题:就是代码耦合,后台服务中需要嵌入搜索和商品页面服务,违背了微服务的独立原则。

这时,我们就会采用另外一种解决办法,那就是消息队列! 

        商品服务对商品增删改以后,无需去操作索引库和静态页面,只需向MQ发送一条消息(比如包含商品id的消息),也不关心消息被谁接收。 搜索服务和静态页面服务监听MQ,接收消息,然后分别去处理索引库和静态页面(根据商品id去更新索引库和商品详情静态页面)。 

二. RabbitMQ介绍

2.1. 什么是mq?

        消息队列(Message Queue,简称MQ):是在消息的传输过程中保存消息的容器。用于分布式系统之间进行通信。

RabbitMQ入门系列01----RabbitMQ简介

 2.2 选型和对比

RabbitMQ ActiveMQ RocketMQ Kafka
公司/社区 Rabbit Apache 阿里 Apache
开发语言 Erlang Java Java Scala&Java
协议 AMQP OpenWire、AUTO、Stomp、MQTT 自定义 自定义
单机吞吐量 万级 万级(最差) 十万级 十万级
消息延迟 微妙级 毫秒级 毫秒级 毫秒以内
特性 并发能力很强,延时很低 老牌产品,文档较多 MQ功能比较完备,扩展性佳 只支持主要的MQ功能,毕竟是为大数据领域准备的。

综合上面的材料得出以下两点 : 

  1. 中小型软件公司,建议选RabbitMQ.一方面,erlang语言天生具备高并发的特性,RabbitMQ的社区十分活跃,可以解决开发过程中遇到的bug,这点对于中小型公司来说十分重要。不考虑rocketmq和kafka的原因是中小型软件公司不如互联网公司,数据量没那么大,选消息中间件,应首选功能比较完备的,所以kafka和rocketmq排除。

  2. 大型软件公司,根据具体使用在rocketMq和kafka之间二选一。一方面,大型软件公司,具备足够的资金搭建分布式环境,也具备足够大的数据量。针对rocketMQ,大型软件公司也可以抽出人手对rocketMQ进行定制化开发,毕竟国内有能力改JAVA源码的人,还是相当多的。至于kafka,根据业务场景选择,如果有日志采集功能,肯定是首选kafka了。

 2.3 什么是RabbitMQ?

        AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。2006年,AMQP规范发布。类比HTTP。

RabbitMQ入门系列01----RabbitMQ简介

 2.4 为什么使用RabbitMQ?

2.4.1 解耦

  • 传统模式:耦合性太强,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!

RabbitMQ入门系列01----RabbitMQ简介

  • 中间件模式:将消息写入到对列中,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何改变 

RabbitMQ入门系列01----RabbitMQ简介

2.4.2 异步

  • 传统模式:一些非必要的业务逻辑以同步的方式运行,太耗费时间

RabbitMQ入门系列01----RabbitMQ简介

  •  中间件模式:将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度

RabbitMQ入门系列01----RabbitMQ简介

 2.4.3 削峰

  • 传统模式:并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常

RabbitMQ入门系列01----RabbitMQ简介

  •  中间件模式:系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息(秒杀商品)

RabbitMQ入门系列01----RabbitMQ简介

 三. RabbitMQ的安装(linux系统安装)

3.1 下载:

官网下载http://www.rabbitmq.com/download.html

RabbitMQ入门系列01----RabbitMQ简介 

3.2 安装Erlang

  • 上传安装包到linux系统下

RabbitMQ入门系列01----RabbitMQ简介

  •  进入上传后的目录下,依次执行命令:

1)rpm -ivh esl-erlang-17.3-1.x86_64.rpm --force --nodeps

2)rpm -ivh esl-erlang_17.3-1~centos~6_amd64.rpm --force --nodeps

3)rpm -ivh esl-erlang-compat-R14B-1.el6.noarch.rpm --force --nodeps

 3.3 安装RabbitMQ

  • 上传安装包到linux系统下

RabbitMQ入门系列01----RabbitMQ简介

  • 进入上传后的目录下,执行命令:

rpm -ivh rabbitmq-server-3.4.1-1.noarch.rpm

  3.4 启动和停止

service rabbitmq-server start  #启动服务

service rabbitmq-server stop  #停止服务

service rabbitmq-server restart  #重启服务

service rabbitmq-server status  #查看当前服务

 3.5 设置开机自启

chkconfig rabbitmq-server on

3.6 防火墙开放15672端口--外部可访问

/sbin/iptables -I INPUT -p tcp --dport 15672 -j ACCEPT

/etc/rc.d/init.d/iptables save

 3.7 开启web界面管理工具

rabbitmq-plugins enable rabbitmq_management

service rabbitmq-server restart

3.8 创建账户

        这样就算安装成功了,他默认有一个账户,账号guest具有所有的操作权限,并且又是默认账号,出于安全因素的考虑,guest用户只能通过localhost登陆,并且只能在安装机器上使用

        我们创建一个admin账户,创建一个账户并支持远程ip访问

  • 1. 创建账户

rabbitmqctl  add_user admin 1111

  •   2. 给用户添加角色

rabbitmqctl  set_user_tags admin  administrator

  • 3. 设置用户权限

 rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

  • 4.设置完成后可以查看当前用户和角色(需要开启服务)

 rabbitmqctl list_users

3.9 测试

        浏览器输入:serverip:15672。其中serverip是RabbitMQ-Server所在主机的ip,15672是RabbitMQ-Server的端口号

 

 四. RabbitMQ管理界面

4.1 主页总览

RabbitMQ入门系列01----RabbitMQ简介

connections:无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况

channels:通道,建立连接后,会形成通道,消息的投递获取依赖通道。

Exchanges:交换机,用来实现消息的路由

Queues:队列,即消息队列,消息存放在队列中,等待消费,消费后被移除队列。

端口

        5672: rabbitMq的编程语言客户端连接端口

        15672:rabbitMq管理界面端口

        25672:rabbitMq集群的端口

4.2 添加用户

如果不使用guest,我们也可以自己创建一个用户:

RabbitMQ入门系列01----RabbitMQ简介

1、 超级管理员(administrator)

        可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。

2、 监控者(monitoring)

        可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

3、 策略制定者(policymaker)

        可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。

4、 普通管理者(management)

        仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。

5、 其他

        无法登陆管理控制台,通常就是普通的生产者和消费者

4.3 创建Virtual Hosts

虚拟主机:类似于mysql中的database。他们都是以“/”开头

RabbitMQ入门系列01----RabbitMQ简介

4.4 设置权限

1. 点击用户名

RabbitMQ入门系列01----RabbitMQ简介

2、设置权限

RabbitMQ入门系列01----RabbitMQ简介

3、查看效果文章来源地址https://www.toymoban.com/news/detail-401872.html

RabbitMQ入门系列01----RabbitMQ简介

到了这里,关于RabbitMQ入门系列01----RabbitMQ简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【从0开始编写webserver·基础篇#01】为什么需要线程池?写一个线程池吧

    参考: 1、游双Linux高性能服务器编程 2、TinyWebServer 注:虽然是\\\"从0开始\\\",但最好对(多)线程、线程同步等知识点有所了解再看,不然可能有些地方会理解不到位(但也有可能是我没说明到位,水平有限,见谅) Web服务器需要 同时处理多个客户端请求 ,并且每个请求可能

    2024年02月04日
    浏览(58)
  • Isito 入门:为什么学 Istio、Istio 是什么

    本教程已加入 Istio 系列:https://istio.whuanle.cn 目录 1,Istio 概述 🚩聊聊微服务设计 🥇只使用 Kubernetes 部署容器, 🥈开始使用一些中间件,完善基础设施 ❓我为什么要学 Istio 💡所以,Istio 是什么 Istio 三个主要功能 Istio 原理 似乎用上 Kubernetes ,就是微服务系统了。 碰到很

    2024年02月06日
    浏览(35)
  • Mybatis为什么需要预编译等一系列问题

    SQL 预编译是一种提高数据库访问效率的技术,它通过将 SQL 语句预编译并存储在数据库中,减少每次执行时需要进行解析和编译的开销,从而提高数据库访问的效率。 在预编译阶段,SQL 语句会被解析并转换为可执行的二进制代码,然后存储在数据库中。当需要执行该 SQL 语句

    2024年02月10日
    浏览(44)
  • 【探索 Kubernetes|作业管理篇 系列 7】探究 Pod 有什么用,为什么需要它

    大家好,我是秋意零。 前一篇,我们介绍了如何从 0 到 1 搭建 Kubernetes 集群。现在我们可以正式了解,Kubernetes 核心特征了。 今天我们来探究 Pod,为什么需要 Pod? 👿 简介 🏠 个人主页 : 秋意零 🧑 个人介绍 :在校期间参与众多云计算相关比赛,如:🌟 “省赛”、“国

    2024年02月09日
    浏览(54)
  • 为什么黑客不黑/攻击赌博网站?如何入门黑客?

    攻击了,只是你不知道而已! 同样,对方也不会通知你,告诉你他黑了赌博网站。 攻击赌博网站的不一定是正义的黑客,也可能是因赌博输钱而误入歧途的法外狂徒。之前看过一个警方破获的真实案件:28岁小伙因赌博无法提款自学成为黑客,攻击境外博彩网站日进万元,最

    2023年04月11日
    浏览(71)
  • 入门ElasticSearch :为什么选择ES作为搜索引擎?

    随着数据量的不断增长,搜索和分析大规模数据集变得越来越重要。传统数据库在面对这种需求时往往表现不佳,这时候就需要一种专门用于搜索和分析的引擎。ElasticSearch (简称ES)就是这样一款强大的搜索引擎,它具有许多优势,使得它成为许多企业和开发者的首选。 简

    2024年02月09日
    浏览(48)
  • 【Golang】Golang进阶系列教程--为什么 Go 语言 struct 要使用 tags

    在 Go 语言中,struct 是一种常见的数据类型,它可以用来表示复杂的数据结构。在 struct 中,我们可以定义多个字段,每个字段可以有不同的类型和名称。 除了这些基本信息之外,Go 还提供了 struct tags,它可以用来指定 struct 中每个字段的元信息。 在本文中,我们将探讨为什

    2024年02月15日
    浏览(80)
  • MSQL系列(十二) Mysql实战-为什么索引要建立在被驱动表上

    Mysql实战-为什么索引要建立在被驱动表上 前面我们讲解了B+Tree的索引结构,也详细讲解下 left Join的底层驱动表 选择原理,那么今天我们来看看到底如何用以及如何建立索引和索引优化 开始之前我们先提一个问题, 为什么索引要建立在被驱动表上 ? 1.建表及测试数据 我们先

    2024年02月08日
    浏览(48)
  • 【C++入门】你知道C++为什么会有内联函数吗?

    👦个人主页:@Weraphael ✍🏻作者简介:目前学习C++和算法 ✈️专栏:C++航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨ 本章是补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的。 我

    2024年02月03日
    浏览(76)
  • 【Golang】Golang进阶系列教程--为什么 Go 不支持 []T 转换为 []interface

    在 Go 中,如果 interface{} 作为函数参数的话,是可以传任意参数的,然后通过类型断言来转换。 举个例子: 不管是传 int 还是 string,最终都能输出正确结果。 那么,既然是这样的话,我就有一个疑问了,拿出我举一反三的能力。是否可以将 []T 转换为 []interface 呢? 比如下面

    2024年02月15日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包