openresty 学习笔记五:访问RabbitMQ消息队列
openresty 学习笔记五:访问RabbitMQ消息队列
之前通过比较选择,决定采用RabbitMQ这种消息队列来做中间件,目的舒缓是为了让整个架构的瓶颈环节。这里是做具体实施,用lua访问RabbitMQ消息队列。
RabbitMQ消息队列有几个比较重要的概念:生产者Producer,消费者Consumer,交换器Exchanges,队列Queues
我的简单理解
生产者,发布消息入队的用户。
消费者,订阅队列获取消息的用户。
交换器,消息可以不指定某个具体队列,而是发送给交换器,通过不同类型交换器的规则和router key分配到具体的队列。
队列,消息队列载体,每个消息都会被投入到一个或多个队列。
lua 要访问 RabbitMQ 目前只找到一个通过STOMP协议连接的库lua-resty-rabbitmqstomp,前面已经介绍了这个STOMP,RabbitMQ也需要安装适配器才可以。该库我查不到声明exchange和queues并进行绑定的方法,只可以实现发送消息到指定交换器和订阅指定队列。
二次封装
根据自己的业务需要,先稍微做了个二次封装,主要是封装连接步骤和send的方法,同时规范返回值
local rabbitmq = require "resty.rabbitmqstomp"
local _M = {}
_M._VERSION = '0.01'
local mt = { __index = _M }
function _M.new(self, opts)
opts = opts or {}
return setmetatable({
mq_host = opts.host or '127.0.0.1',
mq_port = opts.port or 61613,
mq_timeout = opts.timeout or 10000,
mq_user = opts.username or 'guest',
mq_password = opts.password or 'guest',
mq_vhost = opts.vhost or "/"}, mt)
end
function _M.get_connect(self)
local mq, err = rabbitmq:new({ username = self.mq_user,
password = self.mq_password,
vhost = self.mq_vhost })
if not mq then
return false,err
end
mq:set_timeout(self.mq_timeout)
local ok, err = mq:connect(self.mq_host,self.mq_port)
if not ok then
return false,err
end
return true,mq
end
function _M.send(self , destination, msg)
local ret, client = self:get_connect()
if not ret then
return false,client
end
local send_receipt_id = ngx.now()*1000
local headers = {}
headers["destination"] = destination
headers["receipt"] = send_receipt_id
headers["app-id"] = "luaresty"
headers["persistent"] = "true"
headers["content-type"] = "application/json"
local ok, err = client:send(msg, headers)
if not ok then
return false,err
end
local _,str_start = string.find(ok, "receipt%-id", 1)
local str_end = string.find(ok, "\n\n", 1)
if str_start == nil or str_end == nil then
return false,"send receipt not receive"
end
local receipt_id = string.sub(ok, str_start + 2 ,str_end - 1)
if receipt_id ~= send_receipt_id then
return false,"receipt id not right"
end
local ok, err = client:set_keepalive(10000, 10000)
return true,send_receipt_id
end
return _M
使用示例
local rabbitmq = require ("myRabbitmq")
local mq = rabbitmq:new(config)
local ok , err = mq:send(destination,data)
if not ok then
ngx.log(ngx.ERR, "failed to send mq :", err)
end
openresty 学习笔记五:访问RabbitMQ消息队列的更多相关文章
- openresty 学习笔记番外篇:python访问RabbitMQ消息队列
openresty 学习笔记番外篇:python访问RabbitMQ消息队列 python使用pika扩展库操作RabbitMQ的流程梳理. 客户端连接到消息队列服务器,打开一个channel. 客户 ...
- (五)RabbitMQ消息队列-安装amqp扩展并订阅/发布Demo(PHP版)
原文:(五)RabbitMQ消息队列-安装amqp扩展并订阅/发布Demo(PHP版) 本文将介绍在PHP中如何使用RabbitMQ来实现消息的订阅和发布.我使用的系统依然是Centos7,为了方便, ...
- RabbitMQ学习笔记五:RabbitMQ之优先级消息队列
RabbitMQ优先级队列注意点: 1.只有当消费者不足,不能及时进行消费的情况下,优先级队列才会生效 2.RabbitMQ3.5以后才支持优先级队列 代码在博客:RabbitMQ学习笔记三:Java ...
- kafka学习笔记(一)消息队列和kafka入门
概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...
- RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列
一.理论: .net环境下,C#代码调用RabbitMQ消息队列,本文用easynetq开源的.net Rabbitmq api来实现. EasyNetQ 是一个易于使用的RabbitMQ的.Net客 ...
- RabbitMQ消息队列应用
RabbitMQ消息队列应用 消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景.本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理:二是 ...
- openresty 学习笔记小结:综合应用实例
openresty 学习笔记小结:综合应用实例 这个综合实验实现的功能其实很简单,用户访问一个页面,显示一个默认页面.输入参数(post或者get都可以),如果参数在数据库查询得到并满足一定条件,根据 ...
- RabbitMQ消息队列系列教程(二)Windows下安装和部署RabbitMQ
摘要 本篇经验将和大家介绍Windows下安装和部署RabbitMQ消息队列服务器,希望对大家的工作和学习有所帮助! 目录 一.Erlang语言环境的搭建 二.RabbitMQ服务环境的搭建 三.Ra ...
- SpringBoot笔记十四:消息队列
目录 什么是消息队列 消息队列的作用 异步通信 应用解耦 流量削峰 RabbitMQ RabbitMQ流程简介 RabbitMQ的三种模式 安装RabbitMQ RabbitMQ交换器路由和队列的创建 ...
随机推荐
- 1027 Colors in Mars
People in Mars represent the colors in their computers in a similar way as the Earth people. That is ...
- Unittest单元测试框架——BeautifulReport测试报告和Yagmail自动发送邮件
一.前言 之前在做appium自动化的时候,已经提到过unittest框架的基本概念.用例执行,以及BeautifulReport测试报告的简单使用了(地址:https://www.cnblogs.c ...
- 织梦DedeCMS自定义表单限制IP24小时只能提交多少次
方法1.打开plus/diy.php,找到一下代码, if(!is_array($diyform)) { showmsg('自定义表单不存在', '-1'); exit(); } 然后再在以下代码后面 ...
- hdu4882 水贪心
题意: 给你n个任务,每个任务有两个权值,t[i],b[i],前面的是完成任务所需时间,后面的那个是个参数,每个任务完成的代价是完成当前任务总时间(之前的+现在的) sumt * b[i], ...
- CTB-Locker敲诈者病毒下载器分析
一. 样本基本信息 样本名称:927354529512.scr 样本大小:110592 字节 病毒名称:Win32.Trojan.Ctb-locker.Auto 样本MD5值:3A6D7E551C13 ...
- POJ1258简单最小生成树
#include<stdio.h> #include<algorithm> #define N (100 + 10) using namespace std; typedef ...
- 哈希爆破神器Hashcat的用法
目录 HashCat HshCat的使用 使用Hashcat生成字典 使用Hashcat破解NTLMv2 HashCat HashCat系列软件在硬件上支持使用CPU.NVIDIA GPU.ATI G ...
- Windows核心编程 第四章 进程(上)
第4章 进 程 本章介绍系统如何管理所有正在运行的应用程序.首先讲述什么是进程,以及系统如何创建进程内核对象,以便管理每个进程.然后将说明如何使用相关的内核对象来对进程进行操作.接着,要介绍进 ...
- php单列模式和工厂模式
一.单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的.所有的单例模式至少拥有以下三种公共元素: 1. 它们必须拥有一个构造函数,并且必须被标记为pr ...
- 优雅地使用命令行:Tmux 终端复用
转自:http://harttle.com/2015/11/06/tmux-startup.html 你是否曾经开过一大堆的Terminal?有没有把它们都保存下来的冲动?Tmux 的Session就 ...