当前位置: 技术问答>linux和unix
求教:多连接监控设计问题,谢谢!!欢迎讨论
来源: 互联网 发布时间:2016-08-27
本文导语: 大家好, 我们开发的系统需要实现多前台对后台进程的监控问题,请大家推荐一个好的实现架构: 后台有一个服务进程,多个客户端进程可以对服务进程活动进行监控(建立连接后,后端服务进程的某些操作动作...
大家好, 我们开发的系统需要实现多前台对后台进程的监控问题,请大家推荐一个好的实现架构:
后台有一个服务进程,多个客户端进程可以对服务进程活动进行监控(建立连接后,后端服务进程的某些操作动作记录可以主动推送到客户端)。客户端数量不确定,可以随时增加或减少。不同客户端监控的活动可能也不同,比如客户端1监控服务进程的io操作,客户端2监控服务进程的网络操作。
客户端的总量不会超过50个,服务进程的活动大约几百毫秒一次,希望能够采用多进程设计。
--------------------------------------------------------------------------------------------------------------
目前我的思路是,消息队列 + 多路复用socket方式。增加一个监控管理进程实现全部功能:
1. 服务进程将操作动作写入一个消息队列
2. 监控管理进程维护一个已建立连接的socket列表。该进程建立tcp监听socket lfd,负责接收新的连接请求。该进程采用非阻塞的方式读取消息队列,select方式处理socket。
3. 监控管理进程执行流如下:
--------------------------------------------------------------------------------------------------------------
以上监控管理进程设计存在一下几个问题:
1. 由于采用非阻塞设计,当消息队列为空,上述进程处于空转,忙时等待效率低。
2. 当已建立的socket列表中某个描述符调用send时,延迟可能比较大,从而拖慢整个发送过程,也降低进程对新连接的响应速度。
3. 没有实现信息的分类发送。
4. 这种监控信息属于业务范畴,采用消息队列存储是否合适
--------------------------------------------------------------------------------------------------------------
欢迎大家指教,最好能有更好的解决方案,谢谢!!
后台有一个服务进程,多个客户端进程可以对服务进程活动进行监控(建立连接后,后端服务进程的某些操作动作记录可以主动推送到客户端)。客户端数量不确定,可以随时增加或减少。不同客户端监控的活动可能也不同,比如客户端1监控服务进程的io操作,客户端2监控服务进程的网络操作。
客户端的总量不会超过50个,服务进程的活动大约几百毫秒一次,希望能够采用多进程设计。
--------------------------------------------------------------------------------------------------------------
目前我的思路是,消息队列 + 多路复用socket方式。增加一个监控管理进程实现全部功能:
1. 服务进程将操作动作写入一个消息队列
2. 监控管理进程维护一个已建立连接的socket列表。该进程建立tcp监听socket lfd,负责接收新的连接请求。该进程采用非阻塞的方式读取消息队列,select方式处理socket。
3. 监控管理进程执行流如下:
while (1)
{
select(); //非阻塞,设置较小的超时时间
if (lfd准备好)
{
accept建立连接;
将新socketfd加入socket列表;
}
read消息队列;
if (新消息)
{
遍历socket列表,调用send;
}
}
--------------------------------------------------------------------------------------------------------------
以上监控管理进程设计存在一下几个问题:
1. 由于采用非阻塞设计,当消息队列为空,上述进程处于空转,忙时等待效率低。
2. 当已建立的socket列表中某个描述符调用send时,延迟可能比较大,从而拖慢整个发送过程,也降低进程对新连接的响应速度。
3. 没有实现信息的分类发送。
4. 这种监控信息属于业务范畴,采用消息队列存储是否合适
--------------------------------------------------------------------------------------------------------------
欢迎大家指教,最好能有更好的解决方案,谢谢!!
|
多线程,加锁的办法可能比你那种要好吧,
while (1) 线程1
{
select(); //阻塞
if (lfd准备好)
{
accept建立连接;
将新socketfd加入socket列表;
}
while(1) 线程2
read消息队列; 阻塞
if (新消息)
{
遍历socket列表,调用send;
}
}
while (1) 线程1
{
select(); //阻塞
if (lfd准备好)
{
accept建立连接;
将新socketfd加入socket列表;
}
while(1) 线程2
read消息队列; 阻塞
if (新消息)
{
遍历socket列表,调用send;
}
}
|
用消息机制是一个不错的选择
|
编程不会 故来学习之