当前位置: 首页 > 网络应用技术

RocketMQ消息积压,异步解决方案,缓存策略解决方案

时间:2023-03-08 13:49:03 网络应用技术

  大家好,我是狮子座。

  我们在上一篇文章中介绍了

  遵循上面提到的RocketMQ技术摘要II,本文主要介绍

  30,000个单词谈论MySQL(第一篇文章)

  30,000个字可以谈论什么是redis(完成)

  30,000个单词谈论RocketMQ(2)

  2000万字可以谈论尖峰系统(媒介)

  40,000个字可以在第二侧谈论阿里,以确保您无法完成

  谈论REDIS面试问题

  可以暂时采用异步方案,随后的真实战争将详细详细介绍

  从源代码开始,根据您的未来开发计划有选择地阅读。

  消息的积压是MQ消息队列系统中最常见的性能问题。如下图所示,当生产方的生产效率大于消费者方面的消费者效率时,消息是不完整的,是称为“消息积压”。

  第一个解决方案主要是优化生产方和消费者端的处理能力(不要优化新闻队列,因此最好的团队设计了如此出色的产品,不会遇到问题)

  因此,我们只需要处理如何与消息队列合作以实现最佳性能。

  对于生产而言,它不会影响性能。由于一般生产方首先是由其自己的业务程序执行的,因此复制新闻可用于MQ。如果您的代码性能发送消息不可用,则需要先检查它,发送消息之前的业务逻辑是否是由太多时间引起的。

  在谈论消息之前发送消息的过程中,假设这次平均耗时1毫秒,我们分解了此1MS的时间,主要包括以下项目

  如果单个线程发送,每次仅发送1个消息,则每秒只能发送1000ms / 1ms * 1 / ms = 1000消息。在这种情况下,无法施加消息队列的整个强度。

  无论是增加每个发送消息的批次大小还是增加并发性,它都可以使交货性能增加一倍。

  查看链接生产方发送消息过程

  对于消费者方面,大多数问题都应该在这里。主要调整点也处于此位置。

  如果消费者的表现只是暂时的,那么问题就不大。只要恢复消费者的性能,生产方的性能就会超越,并且可以逐渐消化积压的信息。

  如果消费速度总是比生产速度慢,并且整个系统都会出现问题。要么,无法提供消息队列的存储,也无法丢失消息,这是整个系统的严重失败。因此,当我们设计系统时,我们必须确保消费者端的消费性能高于生产方面的交付性能,使这样的系统可以继续健康。

  除了优化业务绩效外,它还可以水平扩展消费者方面,以增加并发消费量的数量以实现整体消费者的绩效。虽然容量的容量实例数量是分区的数量(也称为队列(也称为队列))必须同步主题中的主题,以确保消费者的实例数和分区数量相等。如下所示。

  如果消费者的实例数量超过了分区的数量,那么这种扩展实际上没有效果。我们之前说的原因,因为对于消费者而言,在每个分区中,我们实际上只能支持单线读取消费

  第二个解决方案的业务情况是,当系统正常运行时,不会有任何消息积压。

  这种问题相对纠结。通常,这通常不是必需的。

  遇到这样一个场景的原因有两个。如果生产不会变得更快,消费将变得越来越慢。我们可以通过监视程序观察数据情况,然后找到某个原因。

  最后,实际上无法减少系统。通过关闭一些不重要的服务,减少了制造商发送的数据量,并且该系统的热门销售业务的最低限度可以正常运作。

  重复消耗也会降低整个系统的消耗速度。

  要重复消费,请参考重复的消费解决方案

  核心要点是查看正式文档

  官方文件是所有技术中最权威,最全面的信息收集场所

  中文网站的某些翻译可能不会及时更新,因此建议直接阅读英语文档并使用翻译。您还可以锻炼英语级别

  首先,我们必须掌握这项技术的整体结构,哪些功能特征,关键技术,实施原理和生态系统等等。这些技术人员对其整体有一定的了解,然后查看其源代码,IT将非常顺利。

  REDIS技术共享如下如下图

  RocketMQ的技术共享尚未绘制,您可以暂时参考官方

  我认为学习这件事的最好的老师是兴趣。因此,请务必阅读有关问题的源代码。例如

  上面的问题是我现在最想知道的,但不要着急,然后在学习整体后加深。

  不要直接从Main阅读。该程序与书不同。这本书是在学习后由人们组织的研究顺序。该计划是网格结构,功能和功能实施

  这也是我下一步从源代码中学习的方式

  如果源代码分析,我的想法是等待我完成RocketMQ的基本原理。我将输入源代码阅读分析并从第一篇文章中涉及的知识点完成完成

  MySQL,甚至Redis,计划强制MQ

  让我们在这里简要谈论思想,然后使用代码案例实施。

  简而言之,异步的想法是当我们要执行时间累积的操作时,我们不会等待操作结束,而是要给该操作一个命令:“操作完成后,下一步要执行什么。”

  尽管使用异步编程模型不会加快程序本身的速度,但它可以减少或避免线程等待,并且只使用很少的线程来实现超高吞吐量。

  同时,我们还需要注意异步模型的问题:与同步实现相比,异步实现的复杂性要大得多,并且代码的可读性和维护将大大降低。将在一定程度上简化奇怪步骤的发展,它不能解决异步模型的高复杂性问题。

  尽管异步性能很好,但不要滥用它。仅在商业逻辑上很简单的情况下,例如消息队列,并且需要长时间等待资源长时间考虑使用异步模型。如果系统的业务逻辑更为复杂并且性能就足够了为了满足业务需求,使用同步模型来满足人类自然思想并易于发展和维护是一个更明智的选择。

  传统的同步网络IO通常使用与接收数据相对应的线程,该线程很难支持高并发和高吞吐量。这次,我们需要使用异步网络IO框架来解决问题。

  Netty和Nio是两个异步网络框架。

  Netty自动解决了线程控制,缓存管理和连接管理的问题。用户只需要实现相应的处理程序即可处理收到的数据。

  Nio是一个更低的API。它提供了使用单个线程同时管理多个连接的选择器机制,从而解决了这种异步网络通信的多路重用的核心问题。

  以上是IO,BIO,NIO,流程图的发展

  缓存策略的出现主要解决了如何减少与磁盘IO的相互作用并改善系统性能。为了持久,必须有一个磁盘。因此,我们必须确保最大的机会的缓存,同时,我们还必须减少与磁盘IO的互动。

  一般而言,SSD每秒可以读写数千次。如果我们的过程在处理业务请求时直接读取和编写磁盘,则假设每个请求都需要3至5次,即使每个请求的数据都不大,每个请求的数据不大,您的程序可以处理约1,000个请求。每秒。记忆的随机读取速度是磁盘的100,000倍!因此,使用内存作为缓存来加速应用程序的访问是一种几乎所有高性能系统的方法。

  使用缓存,首先您将面临选择阅读缓存或阅读和写作缓存的问题。它们之间的唯一区别是,在更新数据时,是否已缓存

  阅读和写作缓存:这是一种牺牲数据一致性以换取性能的设计。它自然不可靠。

  他为什么不可靠?从上面的图中可以看出,当将数据写入PageCache时,它不是同时编写的,而是异步的。如果服务器在此期间不同步时直接扩张,则服务器丢失并且数据丢失。

  如果我们人为地说,一次执行同步。这将失去缓存的含义

  缓存的含义不是减少与磁盘IO的相互作用?

  缓存的实现非常复杂。应用程序不断更新PageCache中的数据。操作系统需要记录更改哪些数据。同时,在另一个线程中,缓存更改更改的数据将更新为磁盘文件。当提供并发读取和写作以更新数据时,有必要确保数据在此过程中的一致性,并且它的性能很好。实现这些目标并不容易。

  因此,通常建议仅读取缓存。

  建议仅阅读缓存建议。对于仅读取缓存,缓存中的数据源只有一种方式,即来自磁盘。当需要更新数据时,磁盘中的数据和缓存中的副本需要更新。我们知道在分布式系统中,除非它是交易或某些分布式一致性算法,以确保数据一致性,这是由于节点停机时间和网络传输故障的存在,我们无法保证缓存缓存数据中的数据和磁盘和磁盘在其中磁盘丢弃数据,并且其中的数据是完全一致。

  我们要做的是确保尽可能最大的数据同步。最令人担忧的是,最大的价格是使用分布式交易来解决。

  另一种简单的方法是实现REDIS的过期密钥。即使数据到期后,即使它仍然具有缓存,我们也认为它不再有效。此数据需要数据更新。

  仍然根据业务。例如,修改了微信头像的真实时间显示。

  如果是这种交易系统,那么那些对数据更敏感的人可以通过牺牲绩效来确定。

  在使用缓存的过程中,除了考虑数据一致性问题外,您还需要注意的另一个重要问题是,在记忆有限的情况下,应优先考虑该数据以使缓存的命中率最高。

  当应用程序要访问某些数据时,如果这些数据在缓存中,则可以直接访问缓存中的数据。这次访问的速度非常快。在此casethese数据中不在缓存中,然后您只能访问磁盘中的数据,这会更慢。在这种情况下,我们称其为“缓存渗透”。显然,缓存的命中率越高,更好的整体性能。

  选择缓存数据的哪种策略可以使高速缓存命中率尽可能高?

  如果您的系统是可以预测将来可以访问哪些数据的系统。例如,某些系统会定期进行数据同步。每个同步数据范围都是相同的。缓存策略非常简单。它是您要访问的数据,您的缓存数据,甚至100%命中。

  但是,大多数系统无法准确预测将来将访问哪些数据,因此它只能使用一些策略来提高缓存率。

  一般而言,当数据首先访问数据时,我们将通过途中将这些数据放入缓存中。随着越来越多的访问数据,总会有一个缓存已满的时刻。目前,需要删除缓存中的某些数据以存储新数据。此过程称为缓存更换。

  在这一点上,问题就变成了:当缓存完整时,删除了数据以使缓存的命中率更高,也就是说,使用了哪种替换策略。

  最高的替换策略必须是基于您的业务逻辑的定制策略。例如,如果您知道某些数据已被删除,并且您将永远不会再次访问,那么首先可以替换这些数据。,您的系统是一个会话系统。您知道哪些用户在线以及哪些用户离线。那些已经更换它们的人的数据也是保留在线用户数据的非常好的策略。

  另一种选择是使用通用替换算法。最经典,最实用的算法是LRU算法,最近也称为“最低使用算法”。该算法的想法是,最近刚刚访问的数据很可能在很可能访问未来,以及很长一段时间以来一直没有访问的数据,并且将来访问的机会不高。

  基于这个想法,LRU算法的原理非常简单。不要看这种LRU算法是如此简单,它的效果非常非常好。

  您可以参考REDIS的LRU文章,实现原则类似于实现LRU算法

  年轻人有梦想,他们不应该停下来。他们还应该采取行动,利用自己的水平,照亮自己的方式,并努力赶上自我宣传的自我 - 自我 - 为了追求自己的梦想

  一些不理解或错误的地方,您指出您必须修改和优化!

  我们非常欢迎添加与个人微信相关的后端问题。我们将在小组中讨论!下次见!

  原始:https://juejin.cn/post/70862621051322015

猜你喜欢