消息队列的学习
https://blog.csdn.net/qq_43154385/article/details/89011224
https://www.jianshu.com/p/824066d70da8(这个讲的很不错)
来个个人通俗的解释吧。
消息队列,顾名思义 首先是个队列。
队列的操作有入队
和出队
也就是你有一个程序在产生内容然后入队(生产者)
另一个程序读取内容,内容出队(消费者)
这是最最基本的概念。
我想你应该是缺乏一个使用场景。
当你不需要立即获得结果,但是并发量又不能无限大的时候,差不多就是你需要使用消息队列的时候。
比如你写日志,因为可能一个客户端有多个操作去写,又有很多个客户端,显然并发不能无穷大,于是你就需要把写日志的请求放入到消息队列里,在消费者那边依次把队列中产生的日志写到数据库里。
至于怎么实现消息队列,其实你本身一个普通的队列就行呀~看你需要什么附加功能而已。
技术都是解决问题的,消息队列解决的是将突发大量请求转换为后端能承受的队列请求,比如你的服务器一秒能处理100个订单,但秒杀活动1秒进来1000个订单,持续10秒,在后端能力无法增加的情况下,你可以用消息队列将总共10000个请求压在队列里,后台consumer按原有能力处理,100秒后处理完所有请求(而不是直接宕机丢失订单数据)
找本数据结构的书看看,队列是一种数据结构,内部是用数组或链表实现的,队列的特点是只能队头放入,队尾取出,即先入先出,具体应用看下生产者消费者;
通俗的说,就是一个容器,你把消息丢进去,不需要立即处理。然后有个程序去从你的容器里面把消息一条条读出来处理。
消息队列,可以是activeMQ,kafka之类的,也可以是数据库的一张任务表。
生产者将数据放到消息队列中,消息队列有数据了,主动叫消费者去拿(俗称push)
消费者不断去轮训消息队列,看看有没有新的数据,如果有就消费(俗称pull)
rocketmq的延时消息队列的实现,
一些基本配置
的概念:
topic:一类标题
tag:二类标题
生产者根据topic和tag把信息推送上去
消费者根据这些类别,把相应的信息取下来,这就是topic和tag的作用
topic虽然是个类别,这个类别包含了很多信息,地址等等;
group_name:生产消费者的组名称
可见详细:https://www.codercto.com/a/25920.html、
对于一个生产者来说,在进行sendmessage的时候,需要知道这个topic应该发给哪个broker。如果没有路由信息的话,需要取注册中心,通过GET_ROUTEINTO_BY_TOPIC去注册中心拿到消息。
生产者在发送消息的时候没有获取到NameServer提供的路由信息,找不到指定的Broker,可能的原因
.Broker没有正确连接NameServer
2.Producer没有连接NameServer
3.Topic没有被正确创建
SyncProducer中指定了NameServer的地址,同时RocketMQ默认情况下会自动创建Topic,所以原因是Broker没有注册到NameServer,重新指定NameServer再启动
nameserver和broker之间的关系,生产者将topic等的注册到broker,可以见到broker的内容是topic,queue的,然后broker会将topic等等所以注册信息转发给nameserver
broker是什么意思呢?
https://blog.csdn.net/hxyascx/article/details/83754115
https://www.jianshu.com/p/573c7349547e
https://www.jianshu.com/p/114832365c8a
https://www.codercto.com/a/50615.html
https://blog.csdn.net/wb_snail/article/details/89214434
broker里面是top和queue,所有的Topic信息保存在broker当中,存储消息的作用,并会定时将Topic信息注册到NameServer;
(1)Broker和NamerServer: Broker(Master or Slave)均会和每一个NameServer实例来建立TCP连接,定时注册topic&broker的路由信息到所有name server中。Broker在启动的时候会注册自己配置的Topic信息到NameServer集群的每一台机器中。即每一个NameServer均有该broker的Topic路由配置信息。其中,Master与Master之间无连接,Master与Slave之间有连接;
(2)Producer与NamerServer: 每一个Producer会与NameServer集群中的一个实例建立TCP连接,从这个NameServer实例上拉取Topic路由信息;
(3)Producer和Broker: Producer会和它要发送的topic相关联的Master的Broker代理服务器建立TCP连接,用于发送消息以及定时的心跳信息;
consumer :消息队列的消费者,同样与NameServer建立连接,从NameServer获取Topic路由信息,并向提供Topic服务的Broker Master,Slave建立连接;
Producer和consumer 都属于客户端,nameserver属于服务端的范畴
broker的模型如下,
broker在整个rocketMq系统中是一个很重要的消息存储模块,保存了以下所有信息。
1、所有的消息都保存在broker当中
2、所有consumer的消费偏移量保存在broker当中
3、所有consumer的订阅关系保存在broker当中
4、所有的Topic信息保存在broker当中
5、延迟队列的消费进度保存在broker当中
broker在整个rocketMq中又担当着消息中枢的功能,转发以下消息
1、Topic的创建和更新消息通过broker转发到namesrv
broker核心需要理解清楚的是消息存储格式,这个会单独的一篇文章来分析consumer的消息存储格式
消息存储是broker的核心,消息存储是broker的核心,消息存储是broker的核心
broker 帮你把消息从发送端传送到接收端
通俗来讲就是指该MQ的服务端
nameserver: namesrv在内存中维护了下面几个数据结构,用于保存broker注册的有关数据,这些数据统称为路由信息
路由信息一个最重要的作用就是告诉consumer和provider,生产者可以往哪里发送消息,消费者可以从哪里进行拉取到消息,后面一篇文章rocketMq工作原理_客户端与namesrv及broker的交互中有介绍到生产者与消费者如何进行路由数据拉取以及如何使用该数据;
nameserver和broker的区别呢:broker就是负责发送消费者发送消息,或者向生产者获取消息的,可是怎么知道消费者在哪里,生产者在哪里呢,就是通过路由信息来定位的,nameserver就是提供路由信息,这些信息可以让broker知道该往哪里发送;
为什么一个topic会有多个队列呢:因为一个队列只能被一个消费者接受,且只能执行其中一个请求,而一个队列里面有多个请求需要排队的,所以有多个队列才能保证每个请求可以被消费的到;
消息队列的流程理解:生产者将信息推送上去,信息包含(topic,tag等等,这2个主要是为了分类归纳的),然后会分配在很多broker中,当然这些信息也会被推送到nameserver
posted on 2019-08-04 11:22 Cherishforchen 阅读(179) 评论(0) 编辑 收藏 举报