rabbitmq Hash冲突和一致性相关问题举例分析

技术rabbitmq Hash冲突和一致性相关问题举例分析这篇文章主要介绍“rabbitmq Hash冲突和一致性相关问题举例分析”,在日常操作中,相信很多人在rabbitmq Hash冲突和一致性相关问题举例分析问题上

本文主要介绍“rabbitmq哈希冲突及一致性相关问题实例分析”。在日常操作中,相信很多人对rabbitmq Hash冲突和一致性相关问题的实例分析有所怀疑。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮你解答“rabbitmq Hash冲突及一致性相关问题实例分析”的疑惑!接下来,请和边肖一起学习!

问题1:哈希冲突的问题?

1. 背景介绍:

当数据量较大时,哈希后的值会出现,指向同一个位置,这就是所谓的哈希冲突。这取决于哈希算法的质量和数据量。哈希算法越差,数据量越大,哈希冲突的概率越大。

2. 然而一旦出现了hash冲突,我们该怎么办呢?

首先,我们应该考虑是否能找到更先进的哈希算法来解决这个问题,这样哈希值就尽可能的统一,冲突也尽可能的少。

其次,如果我们想找到解决散列冲突问题的方法,目前最常用的解决方案是‘链表法’,也就是说,当不同的数据被散列到同一个值时,我们必须把这些键放在一个链表中的值依次对应散列。当哈希冲突较小时,链表的访问速度没有问题。但是一旦冲突变大,就需要对链表进行改造,使其成为红黑树,进一步减少访问冲突键值的数据。

问题2:哈希的一致性问题?

1.背景介绍:

对于hash,另一个必须解决的问题是hash的一致性。它所处的场景经常发生在我们扩展或减少哈希对应的服务器时。例如,当服务器不够用时,当我们添加新服务器时,或者当服务器无缘无故挂起时。在这种情况下,我们希望散列之后的密钥会尽可能少地影响数据的散列所指向的服务器,因此我们有了散列一致性算法。

2.解决方案:

散列算法的一般含义是:散列一个大值uint32,形成一个从0到2 32-1的环。首先,通过哈希算法计算服务器的IP或域名的值,并将其分布在这个环上;然后对数据密钥使用同样的哈希算法,值也分布在这个环上,按顺时针顺序找到下一个服务器,数据放在这个服务器上。

服务器数量太少导致的负载不均衡的情况:

上述算法在服务器数量较大时没有问题,数据会均匀分布到这些服务器上。但是如果服务器数量很少,就会出现数据落在数据不平衡的不同服务器上的现象。

为了解决这个问题,哈希一致性引入了虚拟服务器的含义。思路是这样的:第一,多次计算同一个服务器的哈希值,这样就会有大量的虚拟服务器落在环上,这种情况下的服务器分布会均匀很多,这样数据的哈希值就会分配给虚拟服务器,虚拟服务器最终会指向真实的服务器。

在我看来,这个操作使用了添加映射层的方式,类似于将哈希值映射到自适应数据层,将数据层映射到真实数据。

如何处理问题3: hash中的长尾效应?

1.背景介绍:

开篇之前,作者讲了长尾效应:对于一条消息,被消费者拿走后,如果需要很长时间才能完成,那么作者称这条消息的任务为长尾任务。长尾任务通过哈希后,往往会导致一些服务器上出现短任务,一些服务器上出现很多长尾任务。因此,一些服务器将非常繁忙。作者将这种情况描述为长尾效应。

至于长尾效应,我认为根本原因是消费者处理不同任务的时间有快有慢,也就是说我们只需要能够在hash中识别出那些已经处理了很长时间的服务器,这样那些处理比较慢的服务器就可以分配更少的任务。

2.解决办法:

基于以上思路,作者想到了消息响应机制,也就是在hashhing的时候,给服务器对应的数据添加一个标志,让它记录分配的键值数据是否已经被服务器处理。服务器收到消息任务后,不会立即回复ack消息,处理后再回复ack消息,这样收到ack的哈希记录会将服务器的标志设置为true。这样,哈希后的数据不会直接发送到未完成的服务器。

原理类似于rabbitmq中处理消费者处理的ack响应的思路,但这样一来,在再次进行哈希时,就需要基于ack响应,这可能会导致在提供哈希服务的过程中出现消息堆积的问题。

但是,这个问题也是有道理的,因为即使快消息输给了消费者,当消费者慢的时候,消息只是在消费者身上堆积。当然,我们也可以模拟rabbitmq,增加qos设置的数量,让消费者一次消费多条消息,从而缓解hash服务上的消息堆积。

至此,“rabbitmq Hash冲突及一致性相关问题的实例分析”的研究结束,希望能解决大家的疑惑。理论和实践的结合可以帮助你学得更好。去试试吧!如果你想继续学习更多的相关知识,请继续关注网站,边肖会继续努力,给大家带来更多实用的文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/104215.html

(0)

相关推荐

  • 怎么处理java异步事件的阻塞和非阻塞

    技术怎么处理java异步事件的阻塞和非阻塞本篇内容主要讲解“怎么处理java异步事件的阻塞和非阻塞”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么处理java异步事件的阻塞

    攻略 2021年11月19日
  • Lotus系统中CS与BS有什么区别

    技术Lotus系统中CS与BS有什么区别这篇文章主要为大家展示了“Lotus系统中CS与BS有什么区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Lotus系统中CS与BS

    攻略 2021年12月3日
  • 怎么为机器学习工程设计Python接口

    技术怎么为机器学习工程设计Python接口本篇内容主要讲解“怎么为机器学习工程设计Python接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么为机器学习工程设计Pyth

    攻略 2021年11月26日
  • 第292天学习打卡,知识点回顾 java运行时数据区)

    技术第292天学习打卡,知识点回顾 java运行时数据区) 第292天学习打卡(知识点回顾 java运行时数据区)知识点回顾
    java 运行时数据区程序计数器 :程序计数器(Program Counte

    礼包 2021年10月28日
  • 怎样查看conda的python环境(如何关联jupyter和conda)

    技术windos jupyter动态切换多个conda环境怎么实现本篇内容主要讲解“windos jupyter动态切换多个conda环境怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让

    攻略 2021年12月21日
  • 如何使用mybatis的interceptor修改执行sql和传入参数

    技术如何使用mybatis的interceptor修改执行sql和传入参数这篇文章主要介绍“如何使用mybatis的interceptor修改执行sql和传入参数”,在日常操作中,相信很多人在如何使用mybatis的in

    攻略 2021年12月3日