消息队列高手课
RocketMQ 与 Kafka 的复制对比:
RocketMQ:
- 传统的主从模式性能更好,但灵活性和可用性稍差
- 基于 Dledger 的复制方式,在 Broker 故障的时候可以自动选举出新节点,可用性更好,性能稍差,并且资源利用率更低一些。
Kafka:
- 提供了基于 ISR 的更加灵活可配置的复制方式,用户可以自行配置,在可用性、性能和一致性这几方面根据系统的情况来做取舍
- 这种灵活的配置方式学习成本较高
RocketMQ 复制
在 RocketMQ 中,复制的基本单位是 Broker,也就是服务端的进程。
RocketMQ 提供了两种复制方式:
- 一种是异步复制
- 消息先发送到主节点上,就返回“写入成功”
- 然后消息再异步复制到从节点上
- 同步双写
- 消息同步双写到主从节点上,主从都写成功,才返回“写入成功”
这两种方式本质上的区别是,写入多少个副本再返回“写入成功”的问题,异步复制需要的副本数是 1,同步双写需要的副本数是 2
异步复制不丢消息的原因:
在 RocketMQ 中,Broker 的主从关系是通过配置固定的,不支持动态切换。如果主节点宕机,生产者就不能再生产消息了,消费者可以自动切换到从节点继续进行消费。这时候,即使有一些消息没有来得及复制到从节点上,这些消息依然躺在主节点的磁盘上,除非是主节点的磁盘坏了,否则等主节点重新恢复服务的时候,这些消息依然可以继续复制到从节点上,也可以继续消费,不会丢消息,消息的顺序也是没有问题的。 RocketMQ 的这种主从复制方式,牺牲了可用性,换取了比较好的性能和数据一致性。
RocketMQ 支持把一个主题分布到多对主从节点上去,每对主从节点中承担主题中的一部分队列
- 优点:如果某个主节点宕机了,会自动切换到其他主节点上继续发消息,这样既解决了可用性的问题,还可以通过水平扩容来提升 Topic 总体的性能
- 缺点:在需要保证消息严格顺序的场景下,由于在主题层面无法保证严格顺序,所以必须指定队列来发送消息,在这种复制模式下,严格顺序和高可用只能选择一个。
Deldger
RocketMQ 在 2018 年底迎来了一次重大的更新,引入 Deldger,增加了一种全新的复制方式。
Dledger 在写入消息的时候,要求至少消息复制到半数以上的节点之后,才给客户端返回写入成功,并且它是支持通过选举来动态切换主节点的。
Dledger 在选举时,总会把数据和主节点一样的从节点选为新的主节点,这样就保证了数据的一致性,既不会丢消息,还可以保证严格顺序。
Kafka 复制
Kafka 中,复制的基本单位是分区。每个分区的几个副本之间,构成一个小的复制集群,Broker 只是这些分区副本的容器,所以 Kafka 的 Broker 是不分主从的。
Kafka 在写入消息的时候,采用的是异步复制的方式:消息在写入到主节点之后,并不会马上返回写入成功,而是等待足够多的节点都复制成功后再返回。
评论区回答:从请求响应角度来说,是同步请求。实现方式上,采用的是异步方式来实现的。
Kafka 为这个“足够多”创造了一个专有名词:ISR(In Sync Replicas),翻译过来就是“保持数据同步的副本”。
默认情况下,如果所有的 ISR 节点都宕机了,分区就无法提供服务了。你也可以选择配置成让分区继续提供服务,这样只要有一个节点还活着,就可以提供服务,代价是无法保证数据一致性,会丢消息。
Kafka 的这种高度可配置的复制方式,优点是非常灵活,你可以通过配置这些复制参数,在可用性、性能和一致性这几方面做灵活的取舍,缺点就是学习成本比较高。
Kafka no Zookeeper
文中写到:Kafka 使用 ZooKeeper 来监控每个分区的多个节点。
但有人评论说新版本可以不使用 Zookeeper,我查资料后发现却是如此:
https://adityasridhar.com/posts/how-to-easily-install-kafka-without-zookeeper
In order to run kafka without zookeeper, it can be run using Kafka Raft metadata mode ( KRaft ). In KRaft the kafka metadata information will be stored as a partition within kafka itself. There will be a KRaft Quorum of controller nodes which will be used to store the metadata. The metadata will be stored in an internal kafka topic @metadata .
This is available in an experimental mode in kafka 2.8.0
后端技术面试 38 讲
垂直伸缩与水平伸缩
- 所谓的垂直伸缩就是提升单台服务器的处理能力,比如用更快频率的 CPU,用更多核的 CPU,用更大的内存,用更快的网卡,用更多的磁盘组成一台服务器,使单台服务器的处理能力得到提升。通过这种手段提升系统的处理能力。
- 所谓的水平伸缩,指的是不去提升单机的处理能力,不使用更昂贵更快更厉害的硬件,而是使用更多的服务器,将这些服务器构成一个分布式集群,通过这个集群,对外统一提供服务,以此来提高系统整体的处理能力。
缓存
缓存主要有分布式缓存和本地缓存两种。分布式缓存将多台服务器共同构成一个集群,存储更多的缓存数据,共同对应用程序提供缓存服务,提供更强大的缓存能力。
通过使用缓存的好处:
- 一方面应用程序不需要去访问数据库,因为数据库的数据是存在磁盘上的,访问数据库需要花费更多的时间,而缓存中的数据只是存储在内存中的,访问时间更短
- 另一方面,数据库中的数据是以原始数据的形式存在的,而缓存中的数据通常是以结果形式存在,比如说已经构建成某个对象,缓存的就是这个对象,不需要进行对象的计算,这样就减少了计算的时间,同时也减少了 CPU 的压力
- 最主要的,应用通过访问缓存降低了对数据库的访问压力,而数据库通常是整个系统的瓶颈所在。降低了数据库的访问压力,就是改善整个系统的处理能力
断舍离
那些在逗乐艺术上获得大成就的人,家里大多数都整洁干净,并且摆的东西比较少。
只进不出的空间,会让我们的生活停滞不前。
当发生大的自然灾害时,我们马上想到要给灾区“送吃的喝的”,很少人会想到“送厕所”。这也是因为我们常常把注意力集中在“如何获取东西”上。
很多罪犯的家或是出现犯罪的家,总是乱七八糟地扔着很多东西,生活很颓废。
德国诗人歌德的名言:“人最大的罪就是不快活。”
催生犯罪者的不快活的原因很可能有“乌七八糟颓废不堪的居所环境”的因素。
人也是动物,两个以上的人在同一空间内的话,就会相互划定势力范围。这种势力范围就是每个人天生具有的“认可欲求”——要承认我、要明白我——的表现。与撒尿来划定范围的狗不同,人是用物品来圈定的。这种范围欲求越不被满足,达到一定程度就会转化为行动表露出来。
相互体谅的意识越是薄弱,就越觉得对方的东西是破烂、是垃圾,越碍眼。
现实大部分情况是“越是介意别人东西的人,其实越没有充分收拾自己的东西”。这些人带着被害者意识总把责任推向他人,长此以往,就会形成根深蒂固的消极情感。
人的烦恼大部分来自人际关系的问题,这些烦恼绝大部分都是源于“单方面的期待过高”——过多地给对方施加自己的价值观。这种过度施压总跟随着关心和爱护一同出现,因此,越是亲密的家人或恋人越容易出现这种问题。
当对别人抱有期待,或是要责备别人时,要立刻意识到“首先自己要做好!”,主动地开始行动。
雏鸡欲出时以嘴吮卵壳声为“啐”,母鸡欲使小鸡出壳而吃壳为“啄”,只有“啐”与“啄”同步进行时,雏鸡才能破壳而出。
知华女士现在才意识到,自己不能纠结几十日元的小折扣,而是要看自己现在需不需要这个东西。于是,她把所有的积分卡都扔掉,明确了自己买东西的标准——自己需要的不是积分卡,需要的是商品。
如同物质过剩扰乱我们的思维一样,信息泛滥也会引起思维混乱。这要比缺乏信息更遗憾和不幸。并且,信息并不像物品一样,能从视觉上感受到空间压迫感,因此就更需要警惕信息过剩。
面对新信息时,我首先想到的是瑜伽师的告诫“不信、不疑、亲自确认”,包括那些可疑的信息,亲自确认信息的来源、根据,就不会被它牵着鼻子走了。面对不确定信息,无论是选择相信还是怀疑,都很有可能出现问题。
良友有三:一为乐善好施之人;二为医病疗伤之人;三为有慧根灵性之人。
在这样信息泛滥的社会,自己可以信赖的人是必不可少的,他们能帮助我们选择正确的信息和情报。
与物质一样,我们应该和信息本身保持一定的宽松距离。“在必要的时刻,获得必要分量的必要信息。”
与杂物同样,陷入烦恼而不能自拔的人很难去客观地带着全局视角来看问题。烦恼的种类大致分为以下三种:
- 金钱
- 健康
- 人际关系
其实烦恼最多的是三者之中处于基底的“人际关系”。
阿德勒:一切烦恼都来自人际关系
当身陷烦恼的自己能够积极地整顿清理自己所处的空间环境时,内心世界也会发生改变。扔掉一个不需要的杂物,内心就挪出一个空间。
断舍离最重要的并不是使用最少量的物质,而是把多余的杂物清理出空间,恢复“生活”的流动感。
节约的对象大致分为以下三类:
- 金钱
- 精力
- 时间
把三者放在天平上衡量是一个重要的思维习惯。
“结婚”有三个观点:
- 精神性的结婚
- 如字面意思一样,是灵魂的结合
- 这是真正意义上的两个人的爱情
- 只要是两情相悦,互相爱慕,即便是不在户口本上体现,也是精神上的结婚
- 动物性的结婚
- 人和动物一样,都需要性伴侣
- 据说即便总在精神上和社会上出现不和谐声音的夫妇之间,只要肉体上有很高的契合度也不会分开
- 社会性的结婚
- 户口本上标明结为夫妇这一行为的本身就是社会性的结婚的重要因素
- 社会上很多未婚女性对结婚对象有“高收入、高学历、高社会地位”“颜值高”等高要求,这些要求其实是和“社会性的结婚”挂钩的条件。也就是说,作为这种符合高要求的对象的配偶,自己可以获得社会性的利益和社会性的承认。另外,结婚并不是两个人结婚,而是两个家庭结合的问题,因此三者之中“社会性的结婚”的比重逐渐增高
本来结婚是“结不结婚”的问题,但不知何时被偷换成“能不能结婚”的问题,导致很多女性的自我肯定感下降。
断舍离发源于瑜伽哲学的思想,因此总是站在动摇既成观念的立场上,最优先考虑那些因无意识摄取的观念和价值观反而把自己困住的情况。
家务从本质上来说是“养育生命的重要工作”。家务既不等同于“家务劳动”,也不是按小时给酬劳的作业。家务不仅仅为了家人,也是为了自己。
越是觉得家务麻烦的人,就越要尝试一下“压缩杂物=节省时间精力”。这是达到“享受家务活=获得自在人生”境地最好的最便捷的通道。
日常生活中必要的并不是“未来”,而是“当下”。
断舍离,并不是充斥徒劳感的“收拾整理”,而是提升空间次元的“搬家”,同一个地方,同一所房子,却有完全不同的风景,还有崭新的自己。
我认为一定程度的负荷是提高自信心的一种方法。在那些认为人生就应该事事准备万全,才能预防“万一”的人看来,这种思维方式可能比较极端。但是,人总是通过失败才能有所觉醒,才能掌握要领不再重蹈覆辙。
从失败中成长
从生物学的观点来看,呼吸是指既能在以心脏搏动为代表的无意识自律神经系统的控制中,又能被意识控制的唯一生理机能。
每个人都会在某一天失去自己最宝贵的东西。 几乎没有人能在最关键的时刻做到释怀。 只有在日常生活中不断地练习如何放手, 才能坦然地接受烦恼, 甚至衰老、病患和死亡。
“断舍离归根结底是为了让我们坦然接受自身的、珍爱之人的死而进行的训练。”因为,我们的死亡率是 100%的。死,是我们最后等待的肉体的断舍离。无论是谁都避免不了。
可以说所有的物品其实都是来自地球的借用品。那么,我们是把自己从地球处买的东西、获赠的东西错当成自己的东西。
我们常常会忽略的是,生命是有限的,时间和空间也是有限的,可用的能量也是有限的,正因为如此,我们才要断舍离。
想到了分布式系统谬误:带宽是无限的。
虽然“熵增定律(物质从有序趋向无序)”并不是指人的行为规律,但是不愿放弃、渴望获得、期盼增殖的欲望是基于人的本能的。