中间件
文章平均质量分 82
coolshyman
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
RocketMQ集群搭建方式
●Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的Brokerld来定义,Brokerld为0表示Master,非0表示Slave。●优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;原创 2023-09-04 11:00:00 · 283 阅读 · 0 评论 -
RocketMQ的NameServer
在分布式系统中,即使是对等部署的服务,因为请求到达的时间,硬件的状态,操作系统的调度,虚拟机的GC等,任何一个时间点,这些对等部署的节点状态也不可能完全一致,而流量不一致的情况下,只要注册中心在A承诺的时间内(例如1s内)将数据收敛到一致状态(即满足最终一致),流量将很快趋于统计学意义上的一致,所以注册中心以最终一致的模型设计在生产实践中完全可以接受。在服务发现中,服务调用发起方更关注的是其要调用的服务的实时的地址列表和实时健康状态,每次发起调用时,并不关心要调用的服务的历史服务地址列表、过去的健康状态。原创 2023-09-03 10:30:00 · 586 阅读 · 0 评论 -
RocketMQ的Broker
如果对消息的可靠性要求比较严格,可以采用SYNC_MASTER加SLAV E的部署方式。如果只是测试方便,则可以选择仅ASYNC_MASTER或仅SYNC_MASTER的部署方式。SYNC_FLUSH (同步刷新)相比于ASYNC_FLUSH (异步处理)会损失很多性能,但是也更可靠,所以需要根据实际的业务场景做好权衡。ASYNC_FLUSH 模式下的 broker 则利 用刷盘一组消息的模式,可以取得更好的性能。SYNC_MASTER表示当前broker是一个同步复制的Master。原创 2023-09-02 09:45:00 · 528 阅读 · 0 评论 -
RocketMQ消费者
这条消息的消费过程中有4次与DB的交互,如果按照每次5ms计算,那么总共耗时20ms,假设业务计算耗时5ms,那么总过耗时25ms,所以如果能把4次DB交互优化为2次,那么总耗时就可以优化到15ms,即总体性能提高了40%。例如订单扣款类应用,一次处理一个订单耗时1 s,一次处理10个订单可能也只耗时2s,这样即可大幅度提高消费的吞吐量,通过设置consumer的consumeMessageBatchMaxSize返个参数,默认是1,即一次只消费一条消息,例如设置为N,那么每次消费的消息数小于等于N。原创 2023-09-01 10:25:24 · 501 阅读 · 0 评论 -
RocketMQ生产者
所以,一次消息发送的耗时时间是上述三个步骤的总和,而某些场景要求耗时非常短,但是对可靠性要求并不高,例如日志收集类应用,此类应用可以采用oneway形式调用,oneway形式只发送请求不等待应答,而发送请求在客户端实现层面仅仅是一个操作系统系统调用的开销,即将数据写入客户端的socket缓冲区,此过程耗时通常在微秒级。如果业务对消息可靠性要求比较高,建议应用增加相应的重试逻辑:比如调用send同步方法发送失败时,则尝试将消息存储到db,然后由后台线程定时重试,确保消息一定到达Broker。原创 2023-08-31 10:00:00 · 384 阅读 · 0 评论 -
RocketMQ消息优先级
TypeA、TypeB、TypeC三类消息。对这种要求,或者逻辑更复杂的要求,就要用户自己编码实现优先级控制,如果上述的三类消息在一个Topic里,可以使用PullConsumer,自主控制MessageQueue的遍历,以及消息的读取;多个不同的消息类型使用同一个topic时,由于某一个种消息流量非常大,导致其他类型的消息无法及时消费,造成不公平,所以把流量大的类型消息在一个单独的Topic,其他类型消息在另外一个Topic,应用程序创建两个Consumer,分别订阅不同的Topic,这样就可以了。原创 2023-08-30 11:45:00 · 1098 阅读 · 0 评论 -
RocketMQ消息查询
区别于消息消费:先尝后买尝就是消息查询买:消息的消费RocketMQ支持按照下面两种维度("按照Message ld查询消息"、"按照Message Key查询消息")进行消息查询。原创 2023-08-29 11:15:00 · 593 阅读 · 0 评论 -
RocketMQ事务消息
对于Rollback,本身一阶段的消息对用户是不可见的,其实不需要真正撤销消息(实际上RocketMQ也无法去真正的删除一条消息,因为是顺序写文件的)。Broker端对未确定状态的消息发起回查,将消息发送到对应的Producer端(同一个Group的Producer),由Producer根据消息来检查本地事务的状态,进而执行Commit或者Rollback,Broker端通过对比Half消息和Op消息进行事务消息的回查并且推进CheckPoint (记录那些事务消息的状态是确定的)。原创 2023-08-28 10:30:00 · 204 阅读 · 0 评论 -
RocketMQ同步复制和异步复制
通常情况下,应该把Master和Save配置成ASYNC_FLUSH的刷盘方式,主从之间配置成SYNC_MASTER的复制方式,这样即使有一台机器出故障,仍然能保证数据不丢,是个不错的选择。同步复制和异步复制是通过Broker配置文件里的brokerRole参数进行设置的,这个参数可以被设置成ASYNC_MASTER、SYNC_MASTER、SLAVE三个值中的一个。在同步复制方式下,如果Master出故障,Slave上有全部的备份数据,容易恢复,但是同步复制会增大数据写入延迟,降低系统吞吐量。原创 2023-08-27 11:00:00 · 639 阅读 · 0 评论 -
RocketMQ零拷贝原理
当进程在访问这段地址时,通过查找页表,发现虚拟内存对应的页没有在物理内存中缓存,则产生"缺页",由内核的缺页异常处理程序处理,将文件对应内容,以页为单位(4096)加载到物理内存,注意是只加载缺页,但也会受操作系统一些调度策略影响,加载的比所需的多。通过buffer可以减少进程间通信需要等待的时间,当存储速度快的设备与存储速度慢的设备进行通信时,存储慢的数据先把数据存放到buffer,达到一定程度存储快的设备再读取buffer的数据,在此期间存储快的设备CPU可以干其他的事情。原创 2023-08-26 10:30:00 · 475 阅读 · 0 评论 -
RocketMQ消息存储
Apache下开源的另外一款MQ—ActiveMQ (默认采用的KahaDB做消息存储)可选用JDBC的方式来做消息持久化,通过简单的xmI配置信息即可实现JDBC消息存储。RocketMQ消息的存储是由ConsumeQueue和CommitLog配合完成的,消息真正的物理存储文件是CommitLog,ConsumeQueue 是消息的逻辑队列,类似数据库的索引文件,存储的是指向物理存储的地址。(2) ConsumeQueue:消息消费队列,引入的目的主要是提高消息消费的性能。原创 2023-08-25 11:40:28 · 247 阅读 · 0 评论 -
RocketMQ消息发送及消费
另一种提高发送速度的方法是增加Producer的并发量,使用多个Producer同时发送,我们不用担心多Producer同时写会降低消息写磁盘的效率,RocketMQ引入了一个并发窗口,在窗口内消息可以并发地写入DirectMem中,然后异步地将连续一段无空洞的数据刷入文件系统当中。Consumer在消费的过程中,如果发现由于某种原因发生严重的消息堆积,短时间无法消除堆积,这个时候可以选择丢弃不重要的消息,使Consumer尽快追上Producer的进度。想保证不丢消息,可以设置多重试几次。原创 2023-08-24 11:15:00 · 554 阅读 · 0 评论 -
RocketMQ架构
Master也可以部署多个。在RocketMQ中,所有消息队列都是持久化的,长度无限的数据结构,所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用offset来访问,offset为java long类型,64位,理论上在100年内不会溢出,所以认为为是长度无限,另外队列中只保存最近几天的数据,之前的数据会按照过期时间来删除。顺序消息的一种,正常情况下可以保证完全的顺序消息,但是一旦发生通信异常,Broker重启,由于队列总数发生发化,哈希取模后定位的队列会发化,产生短暂的消息顺序不一致。原创 2023-08-23 10:45:00 · 234 阅读 · 0 评论 -
RabbitMQ消息可靠性
你用支付宝给商家支付,如果是个仔细的人,会考虑我转账的话,会不会把我的钱扣了,商家没有收到我的钱?一般我们使用支付宝或微信转账支付的时候,都是扫码,支付,然后立刻得到结果,说你支付了多少钱,如果你绑定的是银行卡,可能这个时候你并没有收到支付的确认消息。往往是在一段时间之后,你会收到银行卡发来的短信,告诉你支付的信息。支付平台如何保证这笔帐不出问题?支付平台必须保证数据正确性,保证数据并发安全性,保证数据最终一致性。支付平台通过如下几种方式保证数据一致性:(1)分布式锁。原创 2023-08-13 23:55:06 · 136 阅读 · 0 评论 -
SpringBoot整合RabbitMQ
2 application.properties中添加连接信息。5 使用RestController发送消息。4 RabbitConfig类。1 添加starter依赖。6 使用监听器,用于推消息。原创 2023-08-13 10:15:00 · 160 阅读 · 0 评论 -
RabbitMQ工作流程详解
一旦TCP连接建立起来,客户端紧接着创建一个AMQP 信道(Channel),每个信道都会被指派一个唯一的ID。(1)消费者连接到RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel)。(2)消费者向RabbitMQ Broker请求消费相应队列中的消息,可能会设置相应的回调函数,以及做一些准备工作。(1)生产者连接RabbitMQ,建立TCP连接(Connection),开启信道(Channel)(7)如果找到,则将从生产者发送过来的消息存入相应的队列中。原创 2023-08-12 23:15:00 · 1242 阅读 · 0 评论 -
Redis缓存设计
缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要。但是将缓存加入应用架构后也会带来一些问题,本文将针对这些问题介绍缓存使用技巧和设计方案。原创 2023-08-12 09:52:40 · 292 阅读 · 0 评论 -
Redis心跳检测
如果因为网络故障,主服务器传播给从服务器的写命令在半路丢失,那么当从服务器向主服务器发送REPLCONFACK命令时,主服务器将发觉从服务器当前的复制偏移量少于自己的复制偏移量,然后主服务器就会根据从服务器提交的复制偏移量,在复制积压缓冲区里面找到从服务器缺少的数据,并将这些数据重新发送给从服务器。注意,主服务器向从服务器补发缺失数据这一操作的原理和部分重同步操作的原理非常相似,这两个操作的区别在于,补发缺失数据操作在主从服务器没有断线的情况下执行,而部分重同步操作则在主从服务器断线并重连之后执行。原创 2023-08-11 21:45:00 · 1037 阅读 · 0 评论 -
Redis复制
在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate) 另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),如下图所示。原创 2023-08-11 11:53:17 · 374 阅读 · 0 评论 -
Redis的AOF持久化
从平摊操作的角度来看,no模式和everysec模式的效率类似,当出现故障停机时,使用no模式的服务器将丢失上次同步AOF文件之后的所有写命令数据。下面的表格展示了一个AOF文件重写例子,当子进程开始进行文件重写时,数据库中只有k1一个键,但是当子进程完成AOF文件重写之后,服务器进程的数据库中已经新设置了k2、k3、k4三个键,因此,重写后的AOF文件和服务器当前的数据库状态并不一致,新的AOF文件只保存了k1一个键的数据,而服务器数据库现在却有k1、k2、k3、k4四个键。原创 2023-08-10 22:45:00 · 366 阅读 · 0 评论 -
Redis的RDB持久化
Redis是一个键值对数据库服务器,服务器中通常包含着任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及它们的键值对统称为数据库状态。举个例子,下图展示了一个包含三个非空数据库的Redis服务器,这三个数据库以及数据库中的键值对就是该服务器的数据库状态。因为Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。原创 2023-08-10 10:57:41 · 937 阅读 · 0 评论 -
Redis过期键删除策略
另一方面,定时删除策略的缺点是,它对CPU时间是最不友好的:在过期键比较多的情况下,删除过期键这一行为河能会占用相当一部分CPU时间,在内存不紧张但是CPU时间非常紧张的情况下,将CPU时间用在删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响。惰性删除策略对CPU时间来说是最友好的:程序只会在取出键时才对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的键,这个策略不会在删除其他无关的过期键上花费任何CPU时间。原创 2023-08-09 23:45:00 · 996 阅读 · 0 评论 -
Redis类型检查与命令多态
借用面向对象方面的术语来说,我们可以认为LLEN命令是多态( polymorphism)的,只要执行LLEN命令的是列表键,那么无论值对象使用的是ziplist编码还是linkedlist编码,命令都可以正常执行。从上面发生类型错误的代码示例可以看出,为了确保只有指定类型的键可以执行某些特定的命令,在执行一个类型特定的命令之前,Redis会先检查输入键的类型是否正确,然后再决定是否执行给定的命令。下图展示了LLEN命令从类型检查到根据编码选择实现函数的整个执行过程,其他类型特定命令的执行过程也是类似的。原创 2023-08-09 11:31:31 · 453 阅读 · 0 评论 -
Redis五大基础类型解析
数据结构特点:即⼀段连续的内存数组,但是和普通的数组不同,他的每⼀个元素空间都是根据其中存储的元素大小来规定的,并不是死板的固定大小,使⽤要求:即当每⼀个元素大小不超过64个字节,总元素个数不超过512个并有记录当前最后⼀个元素位置的指针。数据结构特点:即⼀段连续的内存数组,但是和普通的数组不同,他的每⼀个元素空间都是根据其中存储的元素大小来规定的,并不是死板的固定大小,并有记录当前最后⼀个元素位置的指针。共同好友等:把⼀个⽤户的好友和另⼀个⽤户的好友进⾏交集处理,得到他们的公同好友,然后进⾏推荐。原创 2023-07-29 18:17:03 · 644 阅读 · 0 评论 -
消息服务概述
Kaika是由Apache软件基金会开发的一个开源流处理平台,它是一种高吞吐量的分布式发布订阅消息系统,采用Scala和Java语言编写,提供了快速、可扩展的、分布式的、分区的和可复制的日志订阅服务,其主要特点是追求高吞吐量,适用于产生大量数据的互联网服务的数据收集业务。在多数应用尤其是分布式系统中,消息服务是不可或缺的重要部分,它使用起来比较简单,同时解决了不少难题,例如异步处理、应用解耦、流量削锋、分布式事务管理等,使用消息服务可以实现一个高性能、高可用、高扩展的系统。原创 2023-07-28 18:20:53 · 1266 阅读 · 0 评论
分享