SquirrelMQ消息队列

SquirrelMQ是一个快速的消息队列。

SquirrelMQ特性:

1. SquirrelMQ使用Slab内存分配算法来降低内存碎片,使用epoll来解决高并发问题。效率比redis要高,使用简单。

2. 另外SquirrelMQ支持持久化,在down机的情况下也不用担心数据丢失。

3. SquirrelMQ支持lua脚本,你可以制定自己的处理队列程序,只要在cron/main.lua中编写代码即可。

一,SquirrelMQ使用

下面,我们介绍使用SquirrelMQ消息队列来完成上面所说的应用吧。

1) 安装Lua。

2) 首先下载编译SquirrelMQ:

#> wget http://squirrel-message-queue.googlecode.com/files/squirrel-with-lua-v1.2.zip

#> tar –zxvf squirrel-with-lua-v1.2.zip

#> cd squirrel-with-lua-v1.2

#> make

3) 修改SquirrelMQ配置(squirrel.conf文件):

# 侦听端口 
listingPort 6061 
 # 最大可以使用内存数(单位:字节) 
memoryLimitUsed 524288000 
 # 多长时间进行存储数据到硬盘(防止down机时数据丢失,单位为秒) 
secondsToSaveDisk 30 
 # 多少次数据变化才进行存储数据到硬盘(防止写数据过于频繁) 
chagesToSaveDisk 30 
 # 客户端连接多长时间不操作自动关闭(单位为秒) 
clientExpiredTime 60 
 # 多长时间运行一次cron(单位为毫秒) 
cronLoops 5000 
 # 是否需要密码认证 
enableAuth 0 
 # 认证密码(在enableAuth为1时才需要) 
authPwd [email protected]*%bse[email protected] 
 # lua脚本的路径 
luaFilePath /var/squirrelmq/main.lua 
 # 提供给SquirrelMQ调用的函数 
luaMainFunction __main__ 
 # 是否使用守护进程模式运行 
daemonize 0

我们根据自己的需求来修改配置,特别说明一下的是,当开启Lua处理线程时,我们可以编写Lua脚本来处理队列(在cron/main.lua)。这样就可以让服务器本身来处理消息队列的数据,而不用另外写一个cron程序来处理。下面我们会介绍。

4) 运行SquirrelMQ:

#> ./squirrel –c squirrel.conf

二,使用客户端API

SquirrelMQ提供一个PHP访问的API,在php/squirrel.class.php。我们可以使用这个API文件轻松地访问SquirrelMQ。

这个API文件把所有访问SquirrelMQ的操作封装成一个类,叫Squirrel,在使用时直接new一个Squirrel的对象即可,如下:

?


1

2

3

4

5

<?php

include("squirrel.class.php");

$smq new Squirrel(‘127.0.0.1‘, 6061);

$smq->push_tail("INSERT INTO mytable(uid, username, password)VALUES(NULL, ‘liexusong‘, ‘123456‘);");

?>

这样,我们就可以把一条消息插入到消息队列了。我们可以使用size()方法来获取SquirrelMQ的消息条数:

<?php 
include("squirrel.class.php"); 
$smq = new Squirrel(‘127.0.0.1‘, 6061); 
$size = $smq->size(); 
echo "The SquirrelMQ size: $size"; ?>

SquirrelMQ支持的API有:

1)插入到队列的头部: 
$smq->push_head($message); 
 2)插入到队列的尾部: 
$smq->push_tail($message); 
 3)取得队列的第一条消息,并从队列中删除: 
$message = $smq->pop_head(); 
 4)取得队列的最后一条消息,并从队列中删除: 
$message = $smq->pop_tail(); 
 5)取得队列的第n条消息,并且从队列中删除: 
$message = $smq->pop_index($index); 
 6)取得队列的第一条消息,但不从队列中删除: 
$message = $smq->get_head(); 
 7)取得队列的最后一条消息,但不从队列中删除: 
$message = $smq->get_tail(); 
 8)取得队列的第n条消息,但不从队列中删除: 
$message = $smq->get_index($index); 
 9)取得队列的大小: 
$size = $smq->size(); 
 10)取得队列的状态: 
$stat = $smq->stat();

三,使用Lua处理队列

SquirrelMQ的一个令人兴奋的特性就是支持使用Lua处理队列中的消息,下面我们来介绍一下这个功能。

要开启Lua处理线程,需要在配置文件中把enableLuaThread设置为1。这样SquirrelMQ就会开启Lua处理线程。我们可以在 cron/main.lua文件中编写我们的Lua代码来处理队列中的消息。在cron/main.lua文件中,必须编写一个main的函数,SquirrelMQ就是以这个函数作为入口,如:

function __main__() ...... end

在main函数中,我们可以使用一些SquirrelMQ提供的API函数取得队列中的消息,如smq_pop_head()和smq_pop_tail()等。main函数可以这样写:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

require "luasql.mysql"

 

function __main__()

    env = luasql.mysql()

    con = env:connect("database""username""password""127.0.0.1", 3306)

 

    while true do

       local ok, sql = smq_pop_head()

       if ok then

           res = con:execute(sql)

       end

    end

 

    con:close()

    env:close()

end

记住,SquirrelMQ提供的API都是阻塞的,也就是说,当队列为空时,API会阻塞知道队列有消息可以获取为止,这样做的目的是为了尽量减少Lua线程的运行时间。

在上面例子中,我们使用smq_pop_head()来取得队列的第一条消息,然后执行此消息(con:execute(sql))。

SquirrelMQ提供给Lua线程使用的API有:

ok, item = smq_pop_head() 
 
ok, item = smq_pop_tail() 
 
ok, item = smq_pop_index() 
 
ok, item = smq_get_head() 
 
ok, item = smq_get_tail() 
 
ok, item = smq_get_index() 
 
size = smq_queue_size() 
 
ok = smq_push_head(item) 
 
ok = smq_push_tail(item)

上面的API对应PHP客户端的API。

时间: 2024-08-03 16:49:22

SquirrelMQ消息队列的相关文章

Azure Messaging-ServiceBus Messaging消息队列技术系列6-消息回执

上篇博文中我们介绍了Azure Messaging的重复消息机制.At most once 和At least once. Azure Messaging-ServiceBus Messaging消息队列技术系列5-重复消息:at-least-once at-most-once 本文中我们主要研究并介绍Azure Messaging的消息回执机制:实际应用场景: 同步收发场景下,消息生产者和消费者双向应答模式,例如:张三写封信送到邮局中转站,然后李四从中转站获得信,然后在写一份回执信,放到中转站

【转】MSMQ 微软消息队列 简单 示例

MSMQ它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中:本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理. 我个人的理解,你可以把他当做一种,把数据打包后,发送到一个地方,程序也可以去取到这个打包的程序,队列的机制就不讲了,并发问题荡然无存.呵呵. 上代码: 首先 using System.Messaging; public class MsmqManagerHe

消息队列(msg)

一.消息队列:从一个进程向另一个进程发送数据块,读取不一定是先入先出. 管道与消息队列区别:管道基于字节流的,消息队列基于消息: 管道只能发送字符串,消息队列有类型: 管道随进程,消息队列随内核. 二.创建函数原型:int msgget(key_t key, int msgflg);    //key由ftok生成,IPC_CREAT|IPC_EXCL 接收消息:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, in

第15章 进程间通行 15.6 XSI IPC 15.7 消息队列

15.6 XSI IPC (1)3种称作XSI IPC的IPC是: 1)消息队列 2)信号量 3)共享存储器 (2)标识符和键 1)标识符:是一个非负整数,用于引用IPC结构.是IPC对象的内部名. 2)键:IPC对象的外部名.可使多个合作进程能够在同一IPC对象上汇聚. (3)IPC_PRIVATE键: 用于创建一个新的IPC结构.不能指定此键来引用一个现有的IPC结构. (4)ftok函数: 由一个路径名和项目ID产生一个键. (5)ipc_perm结构体 规定了ipc结构的权限和所有者.

XSI进程间通信-----消息队列

1. 基本特点 1) 消息队列是一个由系统内核负责存储和管理,并通过消息队列标识引用的数据链表,消息队列 和有名管道fifo的区别在: 后者一次只能放一个包,而前者则可以放很多包,这样就能处理发包快,哪包慢的问题 2) 可以通过msgget函数创建一个新的消息队列, 或获取一个已有的消息队列. 通过msgsnd函数 (send)向消息队列的后端追加消息, 通过msgrcv(receive)函数从消息队列的前端提取消息. 3) 消息队列中的每个消息单元除包含消息数据外,还包含消息类型和数据长度.消

android 中使用View的消息队列api更新数据

基本上只要继承自View的控件,都具有消息队列或者handler的一些处理方法,下面是一些handler方法以及被View封装了的方法,其底层用的基本都是handler的api. 我么开一下postDelay的定义 android.view.View  public boolean postDelayed(Runnable action, long delayMillis) {         final AttachInfo attachInfo = mAttachInfo;         

消息队列实现订单异步提交

what MSMQ(Microsoft Message Queue),微软消息队列,用于应用程序之间相互通信的一种异步传输模式.应用程序可以分布在同台机器上,也可以分布于互联的网络中的任意位置.基本原理:消息发送者把要发送的消息放入容器,也就是Message(消息),然后保存到系统公用空间的消息队列中(Message Queue)中,本地或互联位置上的消息接收程序再从队列中取出发给它的消息进行处理.消息类型可以是文本,图像,自定义对象等.消息队列分为公共队列和私有队列. why 一.用于进程间的

Windows消息队列

一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个"消息队列",即应用程序队列,用来存放该程序可能 创建的各种窗口的消息.应用程序中含有一段称作"消息循环"的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中.  二 Windows为当前执行的每个Windows程序维护一个「消息队列」.在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中.程序通过执行一块称之为「消息循

消息队列编程

消息队列:就是一个消息的链表.而一条消息则可看作一个记录,具有特定的格式.进程可以向中按照一定的规则添加新消息:另一些进程则可以从消息队列中读走消息 发送消息队列: #include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#include<stdio.h> struct msgt{ long msgtype; char msgtext[1024]; };int msg_type;char str[