rabbitmq消息件在idc机房监控中的应用

简介: 原文见http://www.linuxboy.net/wordpress2/2009/05/31/295.html  rabbitmq-server是一个消息中间件,由erlang语言写就。
  rabbitmq-server是一个消息中间件,由erlang语言写就。erlang号称是能达到六西格玛标准的电信级编程语言,时下很流行撒。IDC服务器监控似乎跟这个东西风马牛不向及啊,呵呵,其实监控本质就是消息的传送。这么就说得通了。
  进程自动监控的想法是很早以前就有了,当时的情况是这样的:客服人员经常晚上半夜三更给我打电话,说系统慢啊,不可访问啊,其实我上去一看,90%的问题出在程序员写的Java程序上,现象非常讨厌,进程是存在的,日志照常甩出,端口依然存活,就是反映慢到死,这个问题到现在也还是无解啊!没办法,只能够重启应用程序,一重启就好。这么做的次数多了,自己也烦不胜烦。于是就想出个偷懒的主意,能否让客服自己来重启进程呢?当然可以了,给客服个WEB页面,上面有重启的连接,点击即可。问题也来了,页面么,就用php可以搞定,但是涉及到要重启进程,php显然是不适合做这件事的,理由如下:php运行的时候是继承了apache设置的权限,缺省应该是nobody,如果用suexec或者其他身份运行,明显就是为php提升了权限,这样很可能会带来大问题,不可取。比较可行的方法是:php发送消息到消息服务器,然后各服务器跟消息服务器通讯,取出各自的消息,再由本地进程控制重启。这样漏洞比较少。也没有权限的危险。
  具体实现的架构如下:
  php提供展示页面,调用stomp协议发送消息;rabbitmq做消息中间服务器,存储并转发消息;服务器端用Python来接收stomp消息,并调用shell命令执行重启等命令。结构图如下:
650) this.width=650;" onsubmit onchange onunload onselect onreset>
  所用到的软件:
   rabbitmq-server-1.5.5.tar.gz
   rabbitmq-stomp-5ee5e2c0b64a.tar.bz2(不要下default.zip那个包,不能用)
   Python-2.6.2.tgz
mkdir -p /data/mq
cd /data/mq
wget http://www.python.org/ftp/python/2.6.2/Python-2.6.2.tar.bz2
tar jxvf Python-2.6.2.tar.bz2
cd Python-2.6.2
./configure --prefix=/data/python262;make;make install
cd ..;rm -rf Python-2.6.2
wget http://erlang.org/download/otp_src_R13B.tar.gz
tar zxvf otp_src_R13B.tar.gz
cd otp_src_R13B
./configure --prefix=/data/erlang;make;make install
cd ..;rm -rf otp_src_R13B
export PATH=/data/python262/bin:/data/erlang/bin:$PATH
wget http://www.rabbitmq.com/releases/rabbitmq-server/v1.5.5/rabbitmq-server-1.5.5.tar.gz
tar zxvf rabbitmq-server-1.5.5.tar.gz
ln -s rabbitmq-server-1.5.5 rabbitmq-server
cd rabbitmq-server
make all
cd ..;rm -rf rabbitmq-server-1.5.5.tar.gz
wget http://hg.rabbitmq.com/rabbitmq-stomp/archive/5ee5e2c0b64a.tar.bz2
tar jxvf rabbitmq-stomp-5ee5e2c0b64a.tar.bz2
cd rabbitmq-stomp-5ee5e2c0b64a
make
cd ..;rm -rf rabbitmq-stomp-5ee5e2c0b64a.tar.bz2
vi rabbitmq-server/scripts/rabbitmq-server
SERVER_START_ARGS=
改成:
SERVER_START_ARGS='
-pa /data/mq/rabbitmq-stomp-5ee5e2c0b64a/ebin
-rabbit
stomp_listeners [{"0.0.0.0",61613}]
extra_startup_steps [{"STOMP-listeners",rabbit_stomp,kickstart,[]}]'

./rabbitmq-server/scripts/rabbitmq-server -detached
#缺省的用户是guest,密码也是guest,这太不安全了,改之:
./rabbitmq-server/scripts/rabbitmqctl delete_user guest
./rabbitmq-server/scripts/rabbitmqctl add_user songxr Loveyou
./rabbitmq-server/scripts/rabbitmqctl map_user_vhost songxr /

  这样rabbitmq+stomp就配置好了。
  搜遍了网上的php stomp客户端,有好几个,都是一堆文件,其实我们只用到了一个最简单的功能,就是发送,干脆自己写了个函数:

function sendmsg($host,$port,$login,$passcode,$timeout,$msg,$queue) {
  $msg_connect = "CONNECTnlogin:$loginnpasscode:$passcodennx00";
  $msg_send = "SENDndestination:$queuenreceipt:oknn$msgx00";
  $msg_disconnect = "DISCONNECTnnx00";
  if(!($r = fsockopen($host,$port))) return false;
  stream_set_timeout($r, $timeout);
  if(!fwrite($r, $msg_connect.$msg_send.$msg_disconnect)){
          $md = stream_get_meta_data($r);
          if($md['timed_out']) return false;
  }
  if(!('CONNECTED' == fread($r,9))){
          $md = stream_get_meta_data($r);
          if($md['timed_out']) return false;
  }
  fread($r,44);
  $md = stream_get_meta_data($r);
  if($md['timed_out']) return false;
  if(!("RECEIPTnreceipt-id:ok" == fread($r,21))){
          $md = stream_get_meta_data($r);
          if($md['timed_out']) return false;
  }
  if (!(strstr(fgets($r,100),'access_refused'))) {
          fclose($r);
          return true;
  }else{
          fclose($r);
          return false;
  }
}

  发送端程序下载: mqphp.tar.gz
  各个客户端的Python端采用Jason R Briggs的stomp类,加上daemon类和实际执行的server.py和shell脚本,一共四个文件:
  接收端程序下载: mq.tar.gz
  用这个方法就可以远程管理机房的服务器进程了,当然最后别忘了为php程序加上口令密码验证......
Popularity: 95% [?]
相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
6月前
|
传感器 监控 物联网
golang开源的可嵌入应用程序高性能的MQTT服务
golang开源的可嵌入应用程序高性能的MQTT服务
322 3
|
6月前
|
消息中间件 存储 监控
搭建消息时光机:深入探究RabbitMQ_recent_history_exchange在Spring Boot中的应用【RabbitMQ实战 二】
搭建消息时光机:深入探究RabbitMQ_recent_history_exchange在Spring Boot中的应用【RabbitMQ实战 二】
70 1
|
6月前
|
消息中间件 分布式计算 监控
Python面试:消息队列(RabbitMQ、Kafka)基础知识与应用
【4月更文挑战第18天】本文探讨了Python面试中RabbitMQ与Kafka的常见问题和易错点,包括两者的基础概念、特性对比、Python客户端使用、消息队列应用场景及消息可靠性保证。重点讲解了消息丢失与重复的避免策略,并提供了实战代码示例,帮助读者提升在分布式系统中使用消息队列的能力。
183 2
|
5月前
|
消息中间件 Java RocketMQ
消息队列 MQ产品使用合集之当SpringBoot应用因网络不通而启动失败时,该如何解决
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
6月前
|
网络协议 Go 数据安全/隐私保护
golang开源的可嵌入应用程序高性能的MQTT服务
golang开源的可嵌入应用程序高性能的MQTT服务
410 2
|
6月前
|
消息中间件 前端开发 数据库
RocketMQ实战教程之MQ简介与应用场景
RocketMQ实战教程介绍了MQ的基本概念和应用场景。MQ(消息队列)是生产者和消费者模型,用于异步传输数据,实现系统解耦。消息中间件在生产者发送消息和消费者接收消息之间起到邮箱作用,简化通信。主要应用场景包括:1)应用解耦,如订单系统与库存系统的非直接交互;2)异步处理,如用户注册后的邮件和短信发送延迟处理,提高响应速度;3)流量削峰,如秒杀活动限制并发流量,防止系统崩溃。
|
3月前
|
消息中间件 开发工具
【Azure Event Hub】原生应用中使用RabbitMQ,是否可以不改动代码的情况下直接转换为使用Event Hub呢?
【Azure Event Hub】原生应用中使用RabbitMQ,是否可以不改动代码的情况下直接转换为使用Event Hub呢?
|
5月前
|
数据采集 监控 物联网
MQTT协议在智能制造中的应用案例与效益分析
【6月更文挑战第8天】MQTT协议在智能制造中的应用案例与效益分析
134 1
|
5月前
|
消息中间件 Arthas 监控
消息队列 MQ产品使用合集之每次重置reconsumeTimes就无法达到死信阈值,重试次数是否就要应用方控制
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
消息队列 MQ产品使用合集之每次重置reconsumeTimes就无法达到死信阈值,重试次数是否就要应用方控制
|
5月前
|
消息中间件 监控 数据安全/隐私保护
RabbitMQ 技术详解与应用指南
**RabbitMQ** 是一个开源消息代理,基于 AMQP 实现,用于应用程序间轻量、可靠的消息传递。本文档详细介绍了 RabbitMQ 的基础,包括**消息、队列、交换机、绑定、路由键和消费者**等概念,以及其**高可靠性、高性能、灵活性、可扩展性和易用性**等特性。RabbitMQ 使用生产者-消费者模型,消息通过交换机路由到队列,消费者接收并处理。文中还涵盖了安装配置的基本步骤和常见应用场景,如**异步处理、消息推送、系统解耦、流量削峰和日志收集**。
418 2