基本情况介绍:
agent:负载容器的生命周期管理,和容器的健康检查,在容器进程down和start的时候给master发通知
master:接收到agent的消息放到一个队列里面,一个线程循环从队列中获取appid,将最新的应用的实例列表发给router(由于很多种业务场景都会触发router更新,且要保证先后顺序,所以用了一个队列,且把放的和取的分开)
router:router接收到master过来的消息,更新应用的实例列表,以保证请求都转发到可用的实例上。
问题来了:
有的应用处理总超时,导致健康检查频繁的失败和成功,每一次变化都会通知master,master都会通知router,状态变化过于频繁会导致router处理失败。
解决方法一:
队列里本来就放了appid和addtime,再加一个map,key=appid,value=最后一次放入队列的time
每次从队列取出appid后比较addtime和map里面的appid的time,< 不处理,>= 通知router,以此减少通知的频率,减轻router的压力。问题:如果容器的状态变化很频繁,从队列里面取到的时间永远小于map中的时间,永远不会通知。
解决方法二:
将队列改为优先级队列PriorityQueue,这样所有的appid的消息在一起,从队列里面取出来的下一次的appid和上一次的不一样,通知rouer,一样pass。缺点:不能保证先变化的先通知。
解决方法三:
使用queue和set,每次放队列的时候,先判断set是否有appid,有pass,没有set和queue同时添加。这样可以把重复的的在放的时候就过滤掉。为了保证处理过快,过滤重复的效果不佳,每处理队列里面的一个元素,sleep1秒。这个sleep1s对于业务是可以接受的。这个方案对于目前的并发量来说,应该是没有问题的。一定要注意在放set和queue,删set和queue的时候加锁,以防止高并发的问题
综合考虑,我们采用了方案三。
分享到:
相关推荐
本项目"消息队列处理代码"包含了一系列相关文件,用于演示如何在C#环境中使用MSMQ进行消息处理。 1. **MSMQChannel.sln**:这是一个Visual Studio解决方案文件,包含了项目的所有配置和引用。打开此文件,开发者...
发送方将消息放入队列,接收方则在准备好处理时从队列中取出消息。这种模式减少了系统的直接依赖性,提高了容错性和响应速度。 在C#中,MSMQ提供了System.Messaging命名空间,包含了用于操作消息队列的类和方法。...
本文档将详细介绍WebLogic数据库和消息队列的配置方法,主要包括配置数据库连接池和数据源的步骤。 一、配置数据库连接池 在WebLogic中,数据库连接池是通过JDBC(Java Database Connectivity)来实现的。JDBC是一...
think-queue是专门为ThinkPHP5.1设计的一个高效、稳定的队列处理库。 描述中的“tp5.1安装使用think-queue”意味着我们需要了解如何在ThinkPHP5.1项目中配置和启用这个队列服务。通常,这包括以下几个步骤: 1. **...
至于“防卡顿”、“异步”和“自定义消息队列”这三个标签,它们分别对应了我们的目标、方法和解决方案的关键特征。防卡顿是问题所在,异步处理是解决问题的手段,而自定义消息队列则是实现异步处理的具体设计。 在...
本项目名为"C++ 跨平台 异步消息队列",显然它提供了一个用C++编写的跨平台解决方案,用于在不同线程间安全地传递和处理消息。下面我们将深入探讨这个项目的相关知识点。 首先,异步消息队列的核心概念是将任务或...
### ucOS消息队列使用详解 #### 一、配置ucOS消息队列 ...以上就是ucOS消息队列的基本使用方法,包括配置、创建、接收和发送等操作。通过合理利用这些功能,可以有效地管理和传递任务之间的数据。
6. **负载均衡与容错**:消息队列处理系统需要考虑负载均衡,确保消息在多个消费者间均匀分布,同时提供故障转移和高可用性,以防单点故障。 7. **消息确认与重试机制**:为了保证消息的可靠性,消息队列通常支持...
Redis Stream是自Redis 5.0版本引入的新数据类型,提供了一个完整的消息队列解决方案。Stream具有以下特点: 1. 可以记录每个消息的元数据,包括时间戳。 2. 支持消息的持久化。 3. 提供了消费者组的概念,允许多个...
这些消息队列各有特点,例如RabbitMQ支持多种协议,Kafka擅长大数据流处理,而ZeroMQ则提供了轻量级的解决方案。 3. **消息模型**:消息队列通常采用两种模型,即点对点(Point-to-Point)和发布/订阅(Publish/...
本教程将深入探讨Linux环境下的消息队列,包括其概念、实现原理、使用方法以及相关的系统调用。 一、消息队列的概念 消息队列是一种存储消息的特殊数据结构,它允许多个进程同时读取和写入。与管道和信号量不同,...
在队列中,消息按照先进先出(FIFO)的原则进行处理。发送进程将消息放入队列,而接收进程从队列中取出消息。这种设计使得消息发送和接收可以独立进行,提高了系统的并发性和可靠性。 在C语言中,我们可以创建一个...
在Linux环境中,掌握System V和POSIX消息队列的使用方法,以及如何通过编程实现生产者和消费者间的通信,对于任何IT专业人员来说都是重要的技能。通过“消息队列的简单示范”,你可以深入了解这一技术,并将其应用到...
消息队列是一种在分布式系统中...在C和C++这样的低级语言中实现消息队列,不仅可以加深对底层原理的理解,还能灵活地定制解决方案以满足特定的需求。通过分析和学习提供的源码,你将能够更好地掌握消息队列的实现细节。
本文将深入探讨如何使用QQueue、QThread、QMutex和QWaitCondition来模拟消息队列,实现任务的同步处理。 首先,QQueue是Qt提供的一种模板类,它基于STL中的queue实现,主要用于存储和管理对象。QQueue的特点是线程...
下面我们将深入探讨消息队列的概念、工作原理、使用方法以及提供的优点。 1. **消息队列概念**: 消息队列是一种数据结构,存储了由发送进程放入的、被接收进程取出的消息。每个消息都有一个唯一的标识符,称为...
下面将详细阐述易语言消息队列的原理、使用方法以及相关操作。 1. 消息队列的基本概念: 消息队列是一种先进先出(FIFO)的数据结构,其中包含一系列待处理的消息。每个消息都包含特定的信息,如消息类型、发送者...
3. **流量削峰:** 在高峰期,系统的处理能力往往会受到限制,这时可以利用消息队列来暂时存储超出处理能力范围之外的请求,待系统空闲时再进行处理,从而达到平滑流量峰值的目的。 4. **消息通信:** 消息队列还...
在学习和实践中,你需要了解消息队列的基本概念,熟悉所选MQ产品的API和配置,掌握生产者和消费者的创建,以及消息的发送和接收方法。此外,还需要关注消息的可靠传输、消息顺序、消费确认、负载均衡等高级特性。 ...
Linux的消息队列机制为进程间通信提供了一种高效、灵活的解决方案。通过对内核中相关代码的深入分析,我们可以更好地理解消息队列的工作原理,并在实际开发中有效地利用这一强大的IPC工具。无论是处理并发请求还是...