rocketmq

系统学习消息队列分享(四) 消息模型:主题和队列有什么区别?

ぃ、小莉子 提交于 2019-11-28 13:31:24
这节课我们来学习消息队列中像队列、主题、分区等基础概念。这些基础的概念,就像我们学习一门编程语言中的基础语法一样,你只有搞清楚它们,才能进行后续的学习。 如果你研究过超过一种消息队列产品,你可能已经发现,每种消息队列都有自己的一套消息模型,像队列(Queue)、主题(Topic)或是分区(Partition)这些名词概念,在每个消息队列模型中都会涉及一些,含义还不太一样。 为什么出现这种情况呢?因为没有标准。曾经,也是有一些国际组织尝试制定过消息相关的标准,比如早期的 JMS 和 AMQP。但让人无奈的是,标准的进化跟不上消息队列的演进速度,这些标准实际上已经被废弃了。 那么,到底什么是队列?什么是主题?主题和队列又有什么区别呢?想要彻底理解这些,我们需要从消息队列的演进说起。 主题和队列有什么区别? 在互联网的架构师圈儿中间,流传着这样一句不知道出处的名言,我非常认同和喜欢:好的架构不是设计出来的,而是演进出来的。 现代的消息队列呈现出的模式,一样是经过之前的十几年逐步演进而来的。 最初的消息队列,就是一个严格意义上的队列。在计算机领域,“队列(Queue)”是一种数据结构,有完整而严格的定义。在维基百科中,队列的定义是这样的: 队列是先进先出(FIFO, First-In-First-Out)的线性表(Linear List)。在具体应用中通常用链表或者数组来实现

系统学习消息队列分享(一) 怎样系统学习消息队列

喜你入骨 提交于 2019-11-28 13:07:53
从系统之间有通信需求开始呢,就产生了消息队列,它也是最古老的中间件之一。它的应用场景非常广泛,分布式系统中的很多进程间通信问题,都可以用消息队列来解决。可以说消息队列是所有后端程序员的必备技能。但是,想要系统、深入地学习消息队列,却并不容易。 要了解消息队列的完整知识体系,想深度进阶为消息队列达人,从理论到实践,从基础到进阶,从深度到广度,全方位吃透消息队列。 哪些人适合学消息队列? 后端开发者:消息队列几乎是每个后端程序员都会用到的中间件,无论你是开发微服务,实时计算,还是机器学习程序,都需要解决进程间通信的问题。 渴望技术提升的开发者:消息队列所涉及的高性能通信、海量数据存储、高并发这些底层的技术比较全面,并且功能简洁、结构清晰,容易入门但又同时具有足够的深度,非常适合用来深入分析和学习底层技术,帮助你实现从用“轮子”到造“轮子”的技术提升。 学习消息队列,有哪些门槛? 至少熟练掌握一门编程语言,掌握所有程序员都需要具备的一些基础技术知识和能力,例如: 熟练使用各种常用集合,比如:数组、链表、字典等; 掌握 Linux 系统的基础知识,会使用常用的命令; 具备多线程、并发控制编程能力; 编写过读写文件、通过网络收发数据的程序; 能看懂最基本的 UML 图,包括类图、时序图等; 了解最常用的几种设计模式和算法。 以下内容是一些“加分项”,当然这些“加分项”你不一定非要具备

rocketmq源码解析之NamesrvController创建

十年热恋 提交于 2019-11-28 11:08:02
说在前面 本次开始进行rocketmq源码解析,比较喜欢rocketmq的架构设计,rocketmq内嵌了namesrv注册中心保存了元数据,进行负载均衡、容错的一些处理,4.3以上支持消息事务,有管理控制台、命令行工具,底层namesrv与broker、client与server交互netty实现。 源码解析 创建NamesrvController,进入这个方法org.apache.rocketmq.namesrv.NamesrvStartup#main,再进入这个方法org.apache.rocketmq.namesrv.NamesrvStartup#main0 public static NamesrvController main0(String[] args) { try { // 源码解析之创建namesrv控制器 =》 NamesrvController controller = createNamesrvController(args); // 源码解析之启动namesrv控制器 =》 start(controller); String tip = "The Name Server boot success. serializeType=" + RemotingCommand.getSerializeTypeConfigInThisServer(); log

消息队列

♀尐吖头ヾ 提交于 2019-11-28 07:26:01
1、什么是消息? 说白了就是传输的数据. 2、什么是消息队列? 说白了就是存放消息的容器,当我们需要消息的时候就去消息队列里取。 3、作用? 消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性、消息通讯。 4、常用的消息队列? 目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ 5、消息队列带来的问题? 系统可用性降低: 系统可用性在某种程度上降低,为什么这样说呢?在加入MQ之前,你不用考虑消息丢失或者说MQ挂掉等等的情况,但是,引入MQ之后你就需要去考虑了! 系统复杂性提高: 加入MQ之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题! 一致性问题: 我上面讲了消息队列可以实现异步,消息队列带来的异步确实可以提高系统响应速度。但是,万一消息的真正消费者并没有正确消费消息怎么办?这样就会导致数据不一致的情况了! 6、常见消息队列对比 对比方向 概要 吞吐量 万级的 ActiveMQ 和 RabbitMQ 的吞吐量(ActiveMQ 的性能最差)要比 十万级甚至是百万级的 RocketMQ 和 Kafka 低一个数量级。 可用性 都可以实现高可用。ActiveMQ 和 RabbitMQ 都是基于主从架构实现高可用性。RocketMQ 基于分布式架构。 kafka

RocketMQ各组件介绍

三世轮回 提交于 2019-11-28 05:47:16
Rocket 架构主要分为4部分: Producer 消息发布者,支持分布式集群部署。Produer 通过 MQ 负载均衡模块选择相应 Broker 中的 queue 进行消息投递,投递过程支持快速失败并且低延迟 Consumer 消息消费的角色,支持分布式集群方式部署。支持以push推,pull拉两种模式对消息进行消费。同时也支持集群方式和广播方式的消费,它提供实时消息订阅机制,可以满足大多数用户的需求 Nameserver NameServer:NameServer是一个非常简单的Topic路由注册中心,其角色类似Dubbo中的zookeeper,支持Broker的动态注册与发现。主要包括两个功能:Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;路由信息管理,每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。NameServer通常也是集群的方式部署,各实例间相互不进行信息通讯。Broker是向每一台NameServer注册自己的路由信息,所以每一个NameServer实例上面都保存一份完整的路由信息

linux安装rocketmq

大憨熊 提交于 2019-11-28 03:50:21
1RocketMQ简介 RocketMQ 是一款分布式、队列模型的 消息中间件 ,具有以下特点: 能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力 官网介绍: https://yq.aliyun.com/articles/624207?utm_content=m_1000012577 2 准备工作 本次安装选择在可连外网的本地虚拟机执行第2步,第3步,将编译好的结果(在SVN安装介质有)copy到服务器配置一下即可 2.1安装jdk https://blog.csdn.net/Shiloh_My/article/details/82911878 https://www.cnblogs.com/pu20065226/p/10730506.html 2.2安装maven 下载源码包 wget http://mirror.bit.edu.cn/apache/maven/binaries/apache-maven-3.2.2-bin.tar.gz tar -zxvf apache-maven-3.2.2-bin.tar.gz 2.3配置环境变量 以root用户修改/etc/profile,追加 export JAVA_HOME=/usr/local/java/jdk1.8.0_201 export CLASSPATH=.:

ubutun18.04安装 rocketmq

你说的曾经没有我的故事 提交于 2019-11-28 00:02:56
1、安装 rocketmq首先要有java以及maven环境,这里略过,可参考 https://www.cnblogs.com/xiaobaoTribe/p/11315011.html 安装JDK 1.8 https://www.cnblogs.com/xiaobaoTribe/p/11361881.html 安装maven 3.5.1 2、切换目录 root@ubuntu:~$ cd /usr/local 3、按照官网指示,下载源文件 rocketmq-all-4.4.0-source-release.zip , 下载页 http://rocketmq.apache.org/dowloading/releases/ root@ubuntu:/usr/local$ wget h ttp://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.4.0/rocketmq-all-4.4.0-source-release.zip 4、解压文件 root@ubuntu:/usr/local$ unzip rocketmq-all-4.4.0-source-release.zip 5、删除文件 root@ubuntu:/usr/local$ remove rocketmq-all-4.4.0-source-release.zip 6、编译打包程序

转战 rocketmq

a 夏天 提交于 2019-11-27 20:49:16
接触 kafka 有一段时间了,一个人的力量实在有限,国内 rocketmq 的生态确实更好,最终决定换方向。 rocketmq 文档地址: http://rocketmq.cloud/zh-cn/docs/bestpractice-broker.html windows 环境下测试, 启动 nameserver: mqnamesrv.cmd -n localhost:9876 启动 broker: mqbroker.cmd -n localhost:9876 创建 topic,创建的 topic 默认 8 个分区: mqadmin.cmd updateTopic -n localhost:9876 -b localhost:10911 -t TopicTest 查看 topic 分区信息: mqadmin.cmd topicStatus -n localhost:9876 -t TopicTest 根据分区 offset 查询消息: mqadmin.cmd queryMsgByOffset -n localhost:9876 -b za-zhangzejiang -i 0 -o 30 -t TopicTest 来源: https://www.cnblogs.com/allenwas3/p/11376010.html

深入理解阿里分布式消息中间件之消息队列

主宰稳场 提交于 2019-11-27 14:01:21
1、为什么要使用消息队列? 分析:一个用消息队列的人,不知道为啥用,有点尴尬。没有复习这点,很容易被问蒙,然后就开始胡扯了。 回答:这个问题,咱只答三个最主要的应用场景(不可否认还有其他的,但是只答三个主要的),即以下六个字:解耦、异步、削峰 (1)解耦 传统模式: 传统模式的缺点: 系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦! 中间件模式: 中间件模式的的优点: 将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。 (2)异步 传统模式: 传统模式的缺点: 一些非必要的业务逻辑以同步的方式运行,太耗费时间。 中间件模式: 中间件模式的的优点: 将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度 (3)削峰 传统模式 传统模式的缺点: 并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常 中间件模式: 中间件模式的的优点: 系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。 2、使用了消息队列会有什么缺点? 分析:一个使用了MQ的项目,如果连这个问题都没有考虑过,就把MQ引进去了,那就给自己的项目带来了风险。 我们引入一个技术,要对这个技术的弊端有充分的认识,才能做好预防。要记住

RocketMQ——NameServer和Broker

二次信任 提交于 2019-11-27 13:54:05
RocketMQ——NameServer和Broker 文章目录 RocketMQ——NameServer和Broker NameServer NameServer功能 为什么不用zookeeper? Broker Broker消息存储 Broker的HA NameServer NameServer功能 NameServer负责维护Producer和Consumer的配置信息、状态信息,并且协调各个角色的协同执行。通过NameServer各个角色可以了解到集群的整体信息,并且他们会定期向NameServer上报状态。 在 org.apache.rocketmq.namesrv.routeinfo 包下的RouteInfoManager类中,定义了许多变量,通过5个HashMap变量存储和维护集群的状态信息 private final static long BROKER_CHANNEL_EXPIRED_TIME = 1000 * 60 * 2 ; private final HashMap < String /* topic */ , List < QueueData > > topicQueueTable ; private final HashMap < String /* brokerName */ , BrokerData > brokerAddrTable ;