rocketmq

分布式之消息队列的特点、选型、及应用场景详解

家住魔仙堡 提交于 2019-12-06 15:24:50
什么是消息队列 消息队列(Message Queue,简称MQ),指保存消息的一个容器,本质是个队列。 消息(Message)是指在应用之间传送的数据,消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,有消息系统来确保信息的可靠专递,消息发布者只管把消息发布到MQ中而不管谁来取,消息使用者只管从MQ中取消息而不管谁发布的,这样发布者和使用者都不用知道对方的存在。 Producer:消息生产者,负责产生和发送消息到 Broker; Broker:消息处理中心。负责消息存储、确认、重试等,一般其中会包含多个 queue; Consumer:消息消费者,负责从 Broker 中获取消息,并进行相应处理; 现在常用的MQ组件有ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ,当然近年来火热的Kafka,从某些场景来说,也是MQ,当然kafka的功能更加强大。 虽然不同的MQ都有自己的特点和优势,但是,不管是哪种MQ,都有MQ本身自带的一些特点,下面,咱们谈谈消息队列的的特点、优势、选型、以及应用场景。 为什么需要消息队列 在高并发分布式环境下,由于来不及同步处理,通过使用消息队列,可以异步处理请求,从而缓解系统的压力。 举一个订单系统的例子:用户点击下订单

聊聊rocketmq的suggestPullingFromSlave

十年热恋 提交于 2019-12-06 15:24:27
序 本文主要研究一下rocketmq的suggestPullingFromSlave suggestPullingFromSlave rocketmq-all-4.6.0-source-release/store/src/main/java/org/apache/rocketmq/store/GetMessageResult.java public class GetMessageResult { private final List<SelectMappedBufferResult> messageMapedList = new ArrayList<SelectMappedBufferResult>(100); private final List<ByteBuffer> messageBufferList = new ArrayList<ByteBuffer>(100); private GetMessageStatus status; private long nextBeginOffset; private long minOffset; private long maxOffset; private int bufferTotalSize = 0; private boolean suggestPullingFromSlave = false; private int

RocketMQ 多副本前置篇:初探raft协议

一笑奈何 提交于 2019-12-06 15:13:43
目录 1、Leader选举 1.1 一轮投票中,只有一个节点发起投票的情况 1.2 一轮投票中,超过一个节点发起投票的情况 1.3 思考如何实现Raft选主 2、日志复制 Raft协议是分布式领域解决一致性的又一著名协议,主要包含Leader选举、日志复制两个部分。 温馨提示: 本文根据raft官方给出的raft动画进行学习,其动画展示地址:http://thesecretlivesofdata.com/raft/ @(本节目录) 1、Leader选举 1.1 一轮投票中,只有一个节点发起投票的情况 Raft协议中节点有3种状态(角色): Follower 跟随者。 Candidate 候选者。 Leader 领导者(Leader),通常我们所说的的主节点。 首先3个节点初始状态为 Follower,每个节点会有一个超时时间(计时器),其时间设置为150ms~300ms之间的随机值。当计时器到期后,节点状态从 Follower 变成 Candidate,如下图所示: 通常情况下,三个节点中会有一个节点的计时器率先到期,节点状态变为 Candidate ,候选者状态下的节点会发起选举投票。我们先来考虑只有一个节点变为Candidate时是如何进行选主的。 当节点状态为Candidate,将发起一轮投票,由于是第一轮投票,设置本轮投票轮次为1,并首先为自己投上一票

org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout 和 RocketmqRemoting closeChannel: close the connection to remote address[] result: true

帅比萌擦擦* 提交于 2019-12-06 13:57:09
org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:588) at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1223) at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1173) at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:214) at com.flying.demo.Producer.main(Producer.java:25) RocketMQ 一直打印 : RocketmqRemoting

docker 保存和导入镜像

余生长醉 提交于 2019-12-06 11:47:37
2、保存镜像 我们的镜像做好之后,我们要保存起来,以供备份使用,该怎么做?使用docker save命令,保存镜像到本地。 [root@rocketmq-nameserver4 dev]# docker save -o rocketmq.tar rocketmq ##-o:指定保存的镜像的名字;rocketmq.tar:保存到本地的镜像名称;rocketmq:镜像名字,通过"docker images"查看 [root@rocketmq-nameserver4 dev]# ll rocketmq.tar为刚保存的镜像 3、载入镜像 我们有了本地的镜像文件,在需要的时候可以使用docker load将本地保存的镜像再次导入docker中。 docker load --input rocketmq.tar 或 docker load < rocketmq.tar 4、删除镜像 有些镜像过时了,我们需要删除。使用如下的命令:docker rmi -f image_id ##-f:表示强制删除镜像;image_id:镜像id 来源: https://www.cnblogs.com/linuxws/p/11981424.html

小P的架构生活(下)

孤街浪徒 提交于 2019-12-06 10:17:23
写于2017-12-20 小L强烈建议团队使用微服务,并极力推荐了前公司用的一套分布式事务解决方案。 小P经过反复思考查证并做了大量的尝试后,辨证地对微服务架构做了如下分析: 为什么要用微服务,微服务带来了哪些好处? 1、减少相同代码的copy 2、屏蔽底层,不对外暴露DB,避免DB耦合 3、业务特定,适合由专门团队维护 4、保留无限伸缩能力 其中好处1、2、3通过传统模块化的方式,通过一定的研发管理也能达成。而伸缩能力才是传统的模块化方法无法达到的。所以说追求水平扩展能力才是我们实施微服务的本质目标。 事物都有两面性,服务化带来的坏处又有哪些? 1、带来了分布式事务 2、开发变复杂了,原本简单的方法调用,现在跨了N个工程,通过各种RPC调用 3、对Devops的要求变高 总而言之,就是一切都变复杂了,成本提高了。 无论是用Dubbo、OSP还是后来的Spring Cloud作为服务化实现的框架,服务发现、熔断、负载均衡,链路追踪、配置中心、监控,甚至由于服务的拆分引入Docker并辅以运维自动化的手段。这些知识,或许对开发人员而言一段时间后都将被淡忘,小P认为一个完善的服务化框架应该是对开发人员屏蔽掉底层这一切的,就像现在HTTP编程不需要过多关注底层网络协议的细节实现一样。关于微服务的定义,不同的人有不同的理解,似乎很难达成完全的一致。小P认为服务化第一是为了水平伸缩

聊聊rocketmq的updateTopicRouteInfoFromNameServer

萝らか妹 提交于 2019-12-06 08:45:44
序 本文主要研究一下rocketmq的updateTopicRouteInfoFromNameServer updateTopicRouteInfoFromNameServer rocketmq-client-4.5.2-sources.jar!/org/apache/rocketmq/client/impl/factory/MQClientInstance.java public class MQClientInstance { private final static long LOCK_TIMEOUT_MILLIS = 3000; private final InternalLogger log = ClientLogger.getLog(); private final ClientConfig clientConfig; private final int instanceIndex; private final String clientId; private final long bootTimestamp = System.currentTimeMillis(); private final ConcurrentMap<String/* group */, MQProducerInner> producerTable = new ConcurrentHashMap

RabbitMQ、Kafka、RocketMQ的优劣势

試著忘記壹切 提交于 2019-12-06 08:41:07
今天我们一起来探讨: 全量的消息队列究竟有哪些? Kafka、RocketMQ、RabbitMQ的优劣势比较 以及消息队列的选型 最全MQ消息队列有哪些 那么目前在业界有哪些比较知名的消息引擎呢?如下图所示 这里面几乎完全列举了当下比较知名的消息引擎,包括: ZeroMQ 推特的Distributedlog ActiveMQ:Apache旗下的老牌消息引擎 RabbitMQ、Kafka:AMQP的默认实现。 RocketMQ Artemis:Apache的ActiveMQ下的子项目 Apollo:同样为Apache的ActiveMQ的子项目的号称下一代消息引擎 商业化的消息引擎IronMQ 以及实现了JMS(Java Message Service)标准的OpenMQ。 MQ消息队列的技术应用 1.解耦 解耦是消息队列要解决的最本质问题。 2.最终一致性 最终一致性指的是两个系统的状态保持一致,要么都成功,要么都失败。 最终一致性不是消息队列的必备特性,但确实可以依靠消息队列来做最终一致性的事情。 2.广播 消息队列的基本功能之一是进行广播。 有了消息队列,我们只需要关心消息是否送达了队列,至于谁希望订阅,是下游的事情,无疑极大地减少了开发和联调的工作量。 3.错峰与流控 典型的使用场景就是秒杀业务用于流量削峰场景。 由于篇幅的关系,本文重点介绍消息队列比较,详细应用场景请参考:

《浅入浅出》-RocketMQ

风流意气都作罢 提交于 2019-12-06 07:49:21
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点脑图、个人联系方式和技术交流群,欢迎Star和指教 前言 消息队列 在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在 消息队列 的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚( 请允许我使用一下夸张的修辞手法 )。 于是在一个寂寞难耐的夜晚,我痛定思痛,决定开始写 《吊打面试官》 系列,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer! 捞一下 消息队列系列前面两章分别讲了 消息队列 的基础知识,还有比较常见的问题和常见分布式事务解决方案,那么在实际开发过程中,我们使用频率比较高的消息队列中间件有哪些呢? 帅丙我工作以来接触的消息队列中间件有 RocketMQ 、 Kafka 、 自研 ,是的因为我主要接触的都是电商公司,相对而言业务体量还有场景来说都是他们比较适合,再加上杭州阿里系公司偏多,身边同事或者公司老大基本都是阿里出来创业的,那在使用技术栈的时候 阿里系的开源框架 也就成了首选。

rocketMQ 消息的 tag

99封情书 提交于 2019-12-06 06:38:55
tag 的使用场景:不同的消费组,订阅同一 topic 不同的 tag,拉取不同的消息并消费。在 topic 层面对消息进行隔离。 producer 发送消息,指定 tag Message msg = new Message("topic-zhang" /* Topic */, "TagA" /* Tag */, "key-zhang", ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */ ); SendResult sendResult = producer.send(msg); consumer 订阅 topic,指定 tag consumer.subscribe("topic-zhang", "TagA||TagB||TagC"); consumer 订阅 tag 信息的存储 // org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData private Set<String> tagsSet = new HashSet<String>(); private Set<Integer> codeSet = new HashSet<Integer>(); broker 计算 tag 的