SEMQ流量控制

来源:互联网 发布:playhome捏脸数据 编辑:程序博客网 时间:2024/06/10 02:36
1.背景
SEMQ的活动有:
.发送消息
.确认:确认目标方接收到
.再确认:目标方确认发送方已知得到确认

这些活动通过3组协议实现。

本地服务器SEMQ在供应宝中是单实例的.

本地服务器注册平台后,SEMQ的待发送消息,确认和再确认消息会不加节制地发出,会造成洪涌现象。不论是平台还是目标方。
缺陷是:
.影响到实时消息的处理
.需要大量的资源:网络,服务器CPU和内存,可能导致系统超负荷而无法响应甚至资源耗竭而崩溃

需要对SEMQ的服务进行流量控制,使整体系统平滑运行,保持稳定的服务质量。


2.机制分析
流量控制是常见的领域。
在SEQM级别(作为一个服务器内部组件)的流量控制只是一个方面。
更广泛的范围需要考虑更多的因素:网络流量,平台负载和能力,目标服务器系统整体性能(包括数据库)。

根据SEMQ的特性,SEMQ流量控制采用跟踪活动,限制最大未完成活动数的方法。
该方法视外部系统为一个黑箱,忽略影响系统表现的诸多因素,仅根据表现进行调节。

流量控制部件:
.水位标队列:提供最大流量控制
.活动跟踪器:存储需要跟踪的(预期有响应)的消息,当得到匹配的消息时,释放活动跟踪项.

存在由于网络或者接收方系统故障,预期的响应消息可能永不可期。
采用活动跟踪项生命期控制,超过指定的时间,释放未被响应的消息。

配置:
.水位标上限
.活动超期时间

3.实现
3.1 定义
#define ACTION_KEY_FORMAT "%d_%d_%d_%I64d"
///< SEMQ活动跟踪项
///< 用于流量控制,SEMQ的活动有:(1)发送消息,(2)确认问询,(3)再确认
///< 唯一识别一个活动: 活动类型,MQ_LOC_KEY(实际上不需要node_type_,node_id_)
struct CActionTraceItem {
//    char action_;
//    MQ_LOC_KEY loc_key;
    
    clock_t ts_; ///< 活动执行时间
};

CSEMQ增加以下成员和方法:
class CSEMQ  : public ISEMQ,public IEventHandler,ACE_Event_Handler {
protected:
    unsigned int water_mark_; ///< 控制水位标.默认:300.
    unsigned short action_trace_timeout_; //< 活动跟踪超时值,单位:秒.默认:120.
    ACE_Semaphore *fc_sema_; ///< 流量控制信号量
    ACE_Hash_Map_Manager<ACE_CString,CActionTraceItem*,ACE_Thread_Mutex> action_trace_; ///< 跟踪消息表

    int handle_timeout(const ACE_Time_Value &tv,const void *arg);
    
public:
    int TraceAction(char action,MQ_LOC_KEY *lock_key); ///< 跟踪一个活动
    int ActionAck(char action,MQ_LOC_KEY *loc_key);  ///< 活动完成确认
};
    
3.2配置
在bbox.conf中增加以下配置项:
    <water_mark>200</water_mark> <!--控制水位标.默认:300 -->
    <action_trace_timeout>60</action_trace_timeout> <!--活动跟踪超时值,单位:秒.默认:120 -->
    
3.3其它
3.3.缺陷:
.在因流量控制任务阻塞时不会释放数据库连接.(最大占用3个连接)


3.3.2关于测试:
.确保零售商端tb_0031有足够的记录,修改这些记录的状态为4.等待执行确认过程.
.调整配置<water_mark>比较小的值,使阻塞容易发生
原创粉丝点击