magic_chao1
这个作者很懒,什么都没留下…
展开
-
26 | MQTT协议:如何支持海量的在线IoT设备?
如果你接入 IoT 设备数量在十万以内,是可以选择开源产品的,如果说客户端的规模超过十万的量级,需要支撑这么大规模的客户端数量,服务端只有单个节点肯定是不够的,必须用一个集群来支持,并且这个集群是要能支持水平扩容的,这些都是最基本的要求。另外,IoT 设备一般都采用无线连接,很多设备都是经常移动的,这就导致,IoT 设备的网络连接不稳定,并且这种不稳定的网络是一个常态。网络结构上,也是 C/S 架构,IoT 设备是客户端,Broker 是服务端,客户端与 Broker 通信进行收发消息。原创 2024-05-16 10:57:36 · 159 阅读 · 0 评论 -
22 | Kafka和RocketMQ的消息复制实现的差异点在哪?
这时候,即使有一些消息没有来得及复制到从节点上,这些消息依然躺在主节点的磁盘上,除非是主节点的磁盘坏了,否则等主节点重新恢复服务的时候,这些消息依然可以继续复制到从节点上,也可以继续消费,不会丢消息,消息的顺序也是没有问题的。在需要保证消息严格顺序的场景下,由于在主题层面无法保证严格顺序,所以必须指定队列来发送消息,对于任何一个队列,它一定是落在一组特定的主从节点上,如果这个主节点宕机,其他的主节点是无法替代这个主节点的,否则就无法保证严格顺序。Kafka 在写入消息的时候,采用的也是异步复制的方式。原创 2024-05-15 16:26:19 · 102 阅读 · 0 评论 -
19 | 数据压缩:时间换空间的游戏
选择压缩算法的时候,主要需要考虑数据的压缩率和压缩耗时。一般来说,压缩率越高的算法,压缩耗时也越高。如果是对性能要求高的系统,可以选择压缩速度快的算法,比如 LZ4;在 Kafka 中,生产者生成一个批消息发给服务端,在服务端中是不会拆分批消息的。那按照批来压缩,意味着,在服务端也不用对这批消息进行解压,可以整批直接存储,然后整批发送给消费者。在开启压缩时,Kafka 选择一批消息一起压缩,每一个批消息就是一个压缩分段。如果要对流数据进行压缩,那必须把流数据划分成多个帧,一帧一帧的分段压缩。原创 2024-05-15 11:21:33 · 116 阅读 · 0 评论 -
16 | 缓存策略:如何使用缓存来减少磁盘IO?
使用内存作为缓存来加速应用程序的访问速度,是几乎所有高性能系统都会采用的方法。原创 2024-05-14 17:50:22 · 183 阅读 · 0 评论 -
15 | Kafka如何实现高性能IO?
它的存储设计非常简单,对于每个分区,它把从 Producer 收到的消息,顺序地写入对应的 log 文件中,一个文件写满了,就开启一个新的文件这样顺序写下去。一般来说,消息刚刚写入到服务端就会被消费,按照 LRU 的“优先清除最近最少使用的页”这种策略,读取的时候,对于这种刚刚写入的 PageCache,命中的几率会非常高。构建批消息和解开批消息分别在发送端和消费端的客户端完成,不仅减轻了 Broker 的压力,最重要的是减少了 Broker 处理请求的次数,提升了总体的处理能力。原创 2024-05-14 16:15:47 · 81 阅读 · 0 评论 -
11 | 如何实现高性能的异步网络传输?
这个 select 方法是一个阻塞方法,这个线程会一直卡在这儿,直到这些 Channel 中的任意一个有数据到来,就会结束等待返回数据。它的返回值是一个迭代器,你可以从这个迭代器里面获取所有 Channel 收到的数据,然后来执行你的数据接收的业务逻辑。因为,每个连接都需要阻塞一个线程来等待数据,大量的连接数就会需要相同数量的数据接收线程。对,会有大量的线程来抢占 CPU 时间,造成频繁的 CPU 上下文切换,导致 CPU 的负载升高,整个系统的性能就会比较慢。Selecor 通过一种类似于。原创 2024-05-14 14:55:29 · 80 阅读 · 0 评论 -
10 | 如何使用异步设计提升系统性能?
在调用异步方法获得返回值 CompletableFuture 对象后,既可以调用 CompletableFuture 的 get 方法,像调用同步方法那样等待调用的方法执行结束并获得返回值,也可以像异步回调的方式一样,调用 CompletableFuture 那些以 then 开头的一系列方法,为 CompletableFuture 定义异步方法结束之后的后续操作。在两次调用账户服务的 Add 方法时,如果某一次调用失败了,该如何处理才能保证账户数据是平的?原创 2024-05-14 14:12:47 · 64 阅读 · 0 评论 -
07 | 消息积压了该如何处理?
主流消息队列的单个节点,消息收发的性能可以达到每秒钟处理几万至几十万条消息的水平,还可以通过水平扩展 Broker 的实例数成倍地提升处理能力。特别需要注意的一点是,在扩容 Consumer 的实例数量的同时,必须同步扩容主题中的分区(也叫队列)数量,使用消息队列的时候,大部分的性能问题都出现在消费端,如果消费的速度跟不上发送端生产消息的速度,就会造成消息积压。如果说,你的代码发送消息的性能上不去,你需要优先检查一下,是不是发消息之前的业务逻辑耗时太多导致的。我们更关注的是,在消息的收发两端,原创 2024-05-13 17:48:57 · 60 阅读 · 0 评论 -
06 | 如何处理消费过程中的重复消息?
在消息传递过程中,如果出现传递失败的情况,发送方会执行重试,重试的过程中就有可能会产生重复的消息。对使用消息队列的业务系统来说,如果没有对重复消息进行处理,就有可能会导致系统的数据出现错误。原创 2024-05-13 16:30:35 · 57 阅读 · 0 评论 -
05 | 如何确保消息不会丢失?
如果你的系统中 Producer 是多实例的,由于并不好协调多个 Producer 之间的发送顺序,所以也需要每个 Producer 分别生成各自的消息序号,并且需要附加上 Producer 的标识,在 Consumer 端按照每个 Producer 分别来检测序号的连续性。首先,像 Kafka 和 RocketMQ 这样的消息队列,它是不保证在 Topic 上的严格顺序的,只能保证分区上的消息是有序的,所以我们在发消息的时候必须要指定分区,并且,在每个分区单独检测消息序号的连续性。原创 2024-05-13 15:57:27 · 59 阅读 · 0 评论 -
04 | 如何利用事务消息实现分布式事务?
分布式事务就是要在分布式系统中的实现事务。在分布式系统中,在保证可用性和不严重牺牲性能的前提下,光是要实现数据的一致性就已经非常困难了,所以出现了很多“残血版”的一致性,比如顺序一致性、最终一致性等等。原创 2024-05-13 15:17:24 · 70 阅读 · 0 评论 -
03 | 消息模型:主题和队列有什么区别?
Exchange 位于生产者和队列之间,生产者并不关心将消息发送给哪个队列,而是将消息发送给 Exchange,由 Exchange 上配置的策略来决定将消息投递到哪些队列中。每个主题包含多个队列,通过多个队列来实现多实例并行生产和消费。需要注意的是,RocketMQ 只在队列上保证消息的有序性,主题层面是无法保证消息的严格顺序的。订阅者的概念是通过**消费组(Consumer Group)**来体现的。每个消费组都消费主题中一份完整的消息,不同消费组之间消费进度彼此不受影响,也就是说,原创 2024-05-13 14:30:36 · 85 阅读 · 0 评论 -
02 | 该如何选择消息队列?
它的同步收发消息的响应时延比较高,因为当客户端发送一条消息的时候,Kafka 并不会立即发送出去,而是要等一会儿攒一批再发送,在它的 Broker 中,很多地方都会使用这种“先攒一波再一起处理”的设计。当你的业务场景中,每秒钟消息数量没有那么多的时候,Kafka 的时延反而会比较高。RabbitMQ 一个比较有特色的功能是支持非常灵活的路由配置,和其他消息队列不同的是,它在生产者(Producer)和队列(Queue)之间增加了一个 Exchange 模块,你可以理解为交换机。响应时延低,消息处理快。原创 2024-05-13 13:52:10 · 113 阅读 · 1 评论 -
01 | 为什么需要消息队列?
无论增加、减少下游系统或是下游系统需求如何变化,订单服务都无需做任何更改,实现了订单服务与下游服务的解耦。使用消息队列隔离网关和后端服务,以达到流量控制和保护后端服务的目的。原创 2024-05-13 11:41:52 · 160 阅读 · 0 评论