用Gearman做队列来实现消息推送

Gearman--任务分发系统 (初探)(JAVA版) 最近拿DBN(Deep Belief Network)做实验, 由于数据维数太大, 程序跑了6天也没训练完成, 由于每天没关机, 弄的电脑特卡. 正好实验室有两台比较空闲的服务器, 所以计划将实验程序放到服务器上运行, 其实直接放到服务器上运行也就可以了,还比较方便快捷. 但是想想要是弄一个任务分发系统, 虽然现在麻烦点, 以后就方便很多了.一开始想自己写一个功能简单一点的, 但是觉得自己写的通用 阅读详情

前面有一篇文章《实现一个简单的服务端推方案》,是Nginx+Lua来实现推送的方式,这里我们换一种作法,用Apache+Gearman作队列来实现。


此方案的主要思路是这样的:

客户端不会频繁的轮询服务端,而是对服务端发起一个长连接,服务端通过阻塞方式读取Gearman队列数据,一旦发现新数据便给客户端发出响应,这次交互便结束了。客户端处理好新数据后再重新发起一个长连接,如此周而复始。

MySQL安装gearman-mysql-udf插件,数据首先是被插入MySQL的表中,MySQL利用触发器调用gearman-mysql-udf函数,将数据写入Gearman,对于Gearman来说,MySQL这边是Client。

接下来,Apache不会再去轮询数据库,而是改为读取Gearman,对于Gearman来说,Apache是Worker,Worker读取队列数据是以阻塞方式时行的,如果有新数据但读出并给客户端发出响应,没有则一直阻塞到超时。Apache做为Gearman的Worker,当读取消息被阻塞时,连接是一直存在的,因些这种方案里,Apache与Gearman会维持大量长连。


注:服务端维持大量长连接时内核参数的调整请参考:http长连接200万尝试及调优。


具体应该需求、实现方法及代码如下


这个应用情况是这样的:
有一个门禁刷卡数据表(已经在用)
现要求针对一些特殊的人,门禁刷卡后,要求在一个液晶屏上显示一些欢迎信息,欢迎信息要及时显示

为不影响现有系统,我们采用一个外挂的形式,新增刷卡记录后,通过触发器将数据插入Gearman队列,浏览器通过Ajax长轮循的方式访问Apache,Apaceh通过PHP连接Gearman,以阻塞读的方式读出记录

对于Gearman来说,MySQL是Client,即生产者,产生队列数据,PHP是Worker,即消费者,取出队列数据


为了让MySQL能将数据传入Gearman,这里使用了lib_mysqludf_json和gearman-mysql-udf的组合,这两个库的安装方法可以参见我的另一篇文章《Gearman分布式任务处理系统(二)扩展应用》


门禁刷卡记录表:

CREATE TABLE `vdooropen` (
  `vid` int(11) NOT NULL AUTO_INCREMENT,
  `doorno` int(11) NOT NULL,
  `rfsim` char(16) NOT NULL,
  `optime` char(15) NOT NULL,
  `ynopen` char(1) NOT NULL,
  PRIMARY KEY (`vid`),
  UNIQUE KEY `vdooropen_I0` (`vid`),
  KEY `vdooropen_i1` (`doorno`,`rfsim`)
) ENGINE=InnoDB;

DELIMITER $$
CREATE TRIGGER t_vopendoor AFTER INSERT ON vdooropen
  FOR EACH ROW BEGIN
    SET @ret=gman_do_background('getmsg', json_object(NEW.vid as 'vid',NEW.doorno as 'doorno',NEW.rfsim as 'rfsim',NEW.optime as 'optime', NEW.ynopen as 'ynopen')); 
  END$$
DELIMITER ;

前端浏览器页面getmsg.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
<script language="JavaScript" type="text/javascript" src="./prototype.js"></script>
</head>

<body>

<script language="JavaScript">
  var Class = {
    create: function() {
      return function() {
        this.initialize.apply(this, arguments);
      }
    }
  }
  var Comet = Class.create();
  Comet.prototype = {
      maxvid: 0,
      url: './backend.php',
      noerror: true,
      initialize: function(){
      },
      connect: function(){
          this.ajax = new Ajax.Request(this.url, {
              method: 'get',
              parameters: {
                  'maxvid': this.maxvid
              },
              onSuccess: function(transport){
                  var response = transport.responseText.evalJSON();
                  this.comet.maxvid = response['vid'];
                  this.comet.handleResponse(response);
                  this.comet.noerror = true;
              },
              onComplete: function(transport){
                  if (!this.comet.noerror) setTimeout(function(){
                                           comet.connect()
                                           }, 5000);
                  else
                  this.comet.connect();
                  this.comet.noerror = false;
              }
          });
          this.ajax.comet = this;
      },
      handleResponse: function(response){
          $('content').innerHTML += '<div>'
                                 + response['vid']    + ','
                                 + response['doorno'] + ','
                                 + response['rfsim']  + ','
                                 + response['optime'] + ','
                                 + response['ynopen']
                                 + '</div>';
      }
  }

  var comet = new Comet();
  comet.connect();

</script>

<div id="content"></div>

</body>
</html>

后端PHP脚本backend.php

<?php

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
flush();
//控制浏览器前端不要缓存结果,每次都要重新查询

$maxvid = $_GET["maxvid"];
error_log(date("[Y-m-d H:i:s]")." > "."maxvid: ".$maxvid."\n", 3 , "/usr/local/apache2219/logs/php_log");

$gmworker = new GearmanWorker();
$gmworker->addServer();
$gmworker->addFunction("getmsg", "getmsg");

if ( ($gmworker->work()) && ($gmworker->returnCode() == GEARMAN_SUCCESS) )
{
  error_log(date("[Y-m-d H:i:s]")." < ".$msg."\n", 3 , "/usr/local/apache2219/logs/php_log");
  echo $msg;
  flush();
}

function getmsg($job)
{
  global $msg;

  $msg = $job->workload();

  $result = "OK";

  return $result;
}

?>


gearman中任务的优先级和返回状态实例分析 本文实例讲述了gearman中任务的优先级和返回状态。分享给大家供大家参考,具体如下: gearman中任务的优先级和返回状态 一、任务的优先级 同步阻塞调用,等待返回结果 doLow:最低优先 doNomal:正常优先级 doHigh:最优先执行 异步派发任务,不等待返回结果,返回任务句柄,通过该句柄可获取任务运行状态信息 doLowBackground doBackground doHighBackground 注意Task和doXXX区别,Task是一组job,派发后会分配到多个worker上并行执行并返回结果给调用方。 而doXXX的每个任务只会在一个worker上执行。 add 立即下载

相关推荐

别只当玩具!聊聊这个555金属探测器电路背后的电磁感应与RLC调谐原理

本文深入解析了555金属探测器电路的工作原理,重点探讨了电磁感应与RLC调谐原理。通过分析电感线圈的电磁特性、RLC谐振电路的行为以及555定时器的多重功能,揭示了这一看似简单的装置如何实现金属检测。文章还提供了灵敏度优化方案和常见问题解决方法,帮助读者从科学角度理解这一实用技术。

weixin_29204205的博客 477

ngx_lua连接gearmand

lua连接geraman并丢任务 function F.unzip() local cjson = require &quot;cjson&quot; local datas = {} local reqdata={} local gearman = require &quot;gearman&quot; local gm = gearman:new() datas[&quot;...

一方 340

用友T3提示,年度[UFDATA_002_2017]并不存在,导致无法备份迁移。

用友T3提示,年度[UFDATA_002_2017]并不存在,导致无法备份迁移。现在都win11了某个年度账套不存在怎么办?

雨季余静的博客 3561

lua-resty-gearman模块

粘贴一段百度对gearman的解释: Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。 lua-resty-gearman模块用于在lua中调用gearman github地址 https://github.com/zhhchen/lua-resty-gearman 调用的代码样...

weixin_33701617的博客 163

Python大数据舆情分析系统开发实战

舆情监测系统是大数据分析的重要应用场景,通过自然语言处理(NLP)技术解析社交媒体文本情感倾向。基于Python技术栈的解决方案整合了Scrapy爬虫框架进行数据采集,PySpark处理海量文本数据,结合SnowNLP和Jieba实现中文语义分析。系统采用微服务架构设计,包含数据采集层、处理层、存储层和应用层,通过情感分析优化和实时热点检测算法提升监测准确率。典型应用包括企业品牌监测、公共事件预警等场景,开发过程中需特别注意数据合规性和分布式集群的性能调优。

weixin_34408624的博客 386

BUCK电路为何无法实现100%占空比?自举电路原理与替代方案解析

在开关电源设计中,DC-DC转换器是实现电压变换的核心器件,其工作原理基于功率开关管的周期性导通与关断。BUCK(降压)电路作为一种经典拓扑,通过调节开关管的占空比来控制输出电压。然而,其占空比存在理论上限,无法达到100%,这一限制源于高边开关管的驱动需求。为了驱动高边N沟道MOSFET(NMOS),需要栅极电压高于源极电压,而自举(Bootstrap)电路通过利用开关节点电压的跳变,巧妙地生成了这一高压驱动信号。自举电路必须在每个开关周期内存在续流阶段(低边管导通)为电容充电,这从根本上限制了最大占空比

weixin_32239523的博客 307

gearman rabbitMQ等 异步队列方案

开发的时候,错误没有任何信息,输出空白会让你发狂! 有时是权限错误问题,有时是php错误什么的,程序停止运行,输出空白,让你一脸懵逼

sm_Bo的博客 1932

DreamerV3实战:如何用世界模型在Minecraft中自动挖钻石(附完整训练流程)

本文详细介绍了如何使用DreamerV3世界模型在Minecraft中训练AI智能体自动完成挖钻石的复杂任务。文章深入分析了该任务对强化学习的挑战,提供了从环境配置、模型训练到结果评估的完整实战流程,并分享了关键的调优技巧与问题解决方案,展示了基于模型的强化学习在解决稀疏奖励问题上的强大能力。

weixin_29050271的博客 189

Gearman vs Beanstalkd

在Web应用程序中大部分内容都与表示有关,但它的价值与竞争优势却可能体现在若干专有服务或算法方面。如果这类处理会消耗大量时间和资源,将其分离出来以异步的方式执行是比较常见的做法。要完成这样的任务,需要一个消息队列来进行管理。Gearman和Beanstalkd是比较常用的两个,这里对这两个队列进行一个对比。 Gearman: Gearman是一个分发任务的程序框架来将你的任务分发到不同

syhd142的专栏 6967

LaTeX伪代码字体大小调整全攻略:从algorithm到algorithm2e的实战技巧

本文详细介绍了在LaTeX中调整伪代码字体大小的全面技巧,涵盖algorithm、algorithmicx和algorithm2e等主流算法包的使用方法。从基础命令到高级配置,帮助用户解决学术论文和技术文档中的伪代码排版问题,提升算法展示的专业性和可读性。特别针对不同期刊格式要求,提供了实用的字体调整方案。

weixin_29297127的博客 436

《童虎学习笔记》5分钟用Keepalived搭建MySQL高可用实现虚ip自动漂移

1

tonghu_note的博客 5617

Gearman安装与使用,分布式消息队列

1 介绍: Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。 2 组成: Gearman client:提供gearman client API给应用程序调用,它是请求的发起者。 Gearman job server:将客户端的请求分发到各个gearman worker的调度者,相当于中央...

qq_29423387的博客 382

移动机器人路径规划中噪声环境下的鲁棒性测试仿真

设计一个二维或三维环境模型,包括静态障碍物和可能存在的动态障碍物。

amy_mhd的博客 125

构建基于redis+gearman+nodejs 的消息推送系统

转自:http://www.woyuw.com/?p=59 前言 系统的核心服务为优惠券获取、预订业务(酒店、机票等)。服务供应商有大型运营商、实体企业。随着PC、各种终端的涌现,人们对消息的即时性要求越来越高,同时也要求我们的运维第一时间能更好服务运营商、实体企业。这就要求我们的信息推送是多方的、快速的、有效的。 系统定位在: 构建基于事件的消息推送系统 事件分为: 优惠券、

竖琴螺Harper'blog 2063

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

PHP异步demo,php实现异步

php本身是没有异步的,但我们经常会需要处理一些耗时操作,如微信公号推送给所有用户,发送邮件、短信等等。实现的方式也是很多,gearman、队列等等。这里我用fscokopen,简单易操作,不用去管服务器那边的事情。function asyncHandle($url, $post_data = ''){$info = parse_url($url);$fp = fsockopen($info["h...

weixin_36085931的博客 150

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

gearman+redis队列持久化

1.下载redis-3.0.2.tar.gz,下载链接:http://download.redis.io/releases/redis-3.0.2.tar.gz          解压安装          开启服务:redis-server/etc/redis.conf            2. 下载gearmand-1.1.12.tar.gz,          解压 tar-

nana的专栏 1608

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux中Gearman安装与使用,分布式消息队列(CentOS-6.5:gearmand-1.1.12)

1 Gearman简介 1.1 概况 Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。 1.2 组成 Gearman是一个分发任务的程序架构,由三部分组成: 1)Gearman client:提供gearman client API给应用程序...

CleverCode的博客 8517

RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总

MQ框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka。这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求。下面我列出这些MQ之间的对比数据和资料。 第一部分:RabbitMQ,ActiveMq,ZeroMq比较 1、 TPS比较 一 ZeroMq 最好,RabbitMq 次之, ActiveMq 最差。这个结论来自于以下这篇文章。 http

Sam_Deep_Thinking 20万+

Gearman分布式任务处理系统(一)基本介绍

Gearman介绍 Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。 通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用 WebService 的方式来处理此类集成问题,但不管采用何种风格的WebService,如 RPC 风格,或者 REST 风格,其本身都有一定的复

很多时候,你缺少的不是知识而是热情 1万+

基于Gearman的PHP封装类

在多个jobs server时,PHP的gearman扩展在jobs server端口不通的情况下会自动检测出来,从而自动切换到另一个;但是在IP不通的情况下,就会出错了。 该封装解决了几个问题: 1、Jobs Server的IP如果突然不可达(例如机器关机),worker会自动重新添加jobs server(默认会报错然后worker终止); 2、添加jobs server时候只添加有效的

小米哥的专栏 757

Gearman分布式任务处理系统(二)扩展应用

对于绝大多数发展中等的web 2.0网站来说,LAMP结构已经不能满足现在的需要了,新的架构组合是GLAMMP,G=Gearman(分布式远程过程处理),M=Memcached(高性能的分布式的内存对象缓存系统)。 Gearman的高级特性 在一个 Web 应用程序内可能有许多地方都会用到 Gearman。可以导入大量数据、发送许多电子邮件、编码视频文件、挖据数据并构建一个中央日志设施 — 所

很多时候,你缺少的不是知识而是热情 7233

Gearman分布式任务处理系统(七)问题研究与性能优化

Gearman工作流程细解 一次正常的Gearman任务执行流程如上图所示: worker向Gearman Server注册自身可以执行的功能 worker尝试获取一个任务 server通告worker暂无任务 worker通告server:“我先睡会,有活干时再叫醒我” client向server发起任务请求 server唤醒可以完成这项工作的worker(可能会唤醒多个

很多时候,你缺少的不是知识而是热情 7937

用Gearman进行分布式任务处理

Gearman是一款开源的通用的分布式任务分发框架,自己本身不做任何实际的工作。它可以将一个个的任务分发给其他的物理机器或者进程,以达到工作的并行运行和LB。 有人说Gearman是分布式 计算框架其实是不太准确的,因为相较于Hadoop而言,Gearman更偏重于任务的分发而不是执行。Gearman扮演的角色更像是一系列分布式进程 的神经系统。 Gearman概述 看到Gearman的

大鹏 2279

php gearman 定时任务,php使用gearman进行任务分发操作实例详解

php使用gearman进行任务分发操作实例详解,创建一个,客户端,操作,实例,回调php使用gearman进行任务分发操作实例详解易采站长站,站长之家为您整理了php使用gearman进行任务分发操作实例详解的相关内容。本文实例讲述了php使用gearman进行任务分发操作。分享给大家供大家参考,具体如下:一、安装gearman下载gearman源码包https://launchpad.net/...

weixin_42462007的博客 468

gearman异步队列安装及使用教程

gearman异步队列安装流程 必备条件:你的centos需要提前安装了lnmp,如果没有安装可以参照教程: http://blog.youkuaiyun.com/e421083458/article/details/21083051 http://blog.youkuaiyun.com/e421083458/article/details/21089901 基础安装包 yum install vim

牛儿吃草的博客 8416

Gearman框架下java+php通信

在上一篇博客中,安装好Gearman和php客户端后,现在尝试下跨语言通信。 注:Gearman最强悍的地方就是它可以支持不同语言直接的交互,client端是一种语言,worker端可以是另外一种语言!中间的交互具体转化细节都封装在jobserver中处理。 这里演示的例子是:官网上面的字符串反转。 worker.php + client.java或 worker.java + clien

时刻保持危机感&对知识的渴望 4181
上一篇: 神奇的Fastcgi_Finish_Request
下一篇: 淘宝技术分享-Http长连接200万尝试及调优
笑天居士
博客等级 码龄24年 292粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值