Delayer

基于 Redis 的延迟消息队列中间件,采用 Golang 开发,支持 PHP、Golang 等多种语言客户端。

参考 有赞延迟队列设计 中的部分设计,优化后实现。

项目链接:https://github.com/mixstart/d... ,有需要的朋友加 Star 哦。

应用场景

  • 订单超过30分钟未支付,自动关闭订单。
  • 订单完成后, 如果用户一直未评价, 5天后自动好评。
  • 会员到期前3天,短信通知续费。
  • 其他针对某个任务,延迟执行功能的需求。

实现原理

  • 客户端:push 任务时,任务数据存入 hash 中,jobID 存入 zset 中,pop 时从指定的 list 中取准备好的数据。
  • 服务器端:定时使用连接池并行将 zset 中到期的 jobID 放入对应的 list 中,供客户端 pop 取出。

核心特征

  • 使用 Golang 开发,高性能。
  • 高可用,服务器端操作是原子的,且做了优雅停止,不会丢失数据。
  • 可通过配置文件控制执行性能参数。
  • 提供具体言语的 SDK,使用简单快捷。

如何使用

delayer 分为:

  • 服务器端:负责定时扫描到期的任务,并放入队列,需在服务器上常驻执行。
  • 客户端:在代码中使用,以类库的形式,提供 push、pop、bPop、remove 方法操作任务。

服务器端

在 https://github.com/mixstart/d... 中下载对应平台的程序。

支持 windows、linux、mac 三种平台

然后修改配置文件 delayer.conf:


[delayer]
pid = /var/run/delayer.pid ; 单例执行, 多实例执行留空, Win不支持
timer_interval = 1000 ; 计算间隔时间, 单位毫秒
access_log = logs/access.log ; 存取日志
error_log = logs/error.log ; 错误日志 [redis]
host = 127.0.0.1 ; 连接地址
port = 6379 ; 连接端口
database = 0 ; 数据库编号
password = ; 密码, 无需密码留空
max_idle = 2 ; 最大空闲连接数
max_active = 20 ; 最大激活连接数
idle_timeout = 3600 ; 空闲连接超时时间, 单位秒
conn_max_lifetime = 3600 ; 连接生存时间, 单位秒

查看帮助:


[root@localhost bin]# ./delayer -h
Usage: delayer [options] Options:
-d/--daemon run in the background
-c/--configuration FILENAME -- configuration file path (searches if not given)
-h/--help -- print this usage message and exit
-v/--version -- print version number and exit

启动:


[root@localhost bin]# ./delayer
____ __
/ __ \___ / /___ ___ _____ _____
/ / / / _ \/ / __ `/ / / / _ \/ ___/
/ /_/ / __/ / /_/ / /_/ / __/ /
/_____/\___/_/\__,_/\__, /\___/_/
/____/
Service: delayer
Version: 1.0.1
[info] 2018/10/19 11:24:24 Service started successfully, PID: 31023

客户端

我们提供了以下几种语言:

根据对应项目的说明使用

License

Apache License Version 2.0, http://www.apache.org/licenses/

原文地址:https://segmentfault.com/a/1190000016779117

Delayer 基于 Redis 的延迟消息队列中间件的更多相关文章

  1. 基于redis的延迟消息队列设计

    需求背景 用户下订单成功之后隔20分钟给用户发送上门服务通知短信 订单完成一个小时之后通知用户对上门服务进行评价 业务执行失败之后隔10分钟重试一次 类似的场景比较多 简单的处理方式就是使用定时任务 ...

  2. 基于redis的延迟消息队列设计(转)

    需求背景 用户下订单成功之后隔20分钟给用户发送上门服务通知短信 订单完成一个小时之后通知用户对上门服务进行评价 业务执行失败之后隔10分钟重试一次 类似的场景比较多 简单的处理方式就是使用定时任务 ...

  3. [转载] 基于Redis实现分布式消息队列

    转载自http://www.linuxidc.com/Linux/2015-05/117661.htm 1.为什么需要消息队列?当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消 ...

  4. laravel5.6 基于redis,使用消息队列(邮件推送)

    邮件发送如何配置参考:https://www.cnblogs.com/clubs/p/10640682.html 用到的用户表: CREATE TABLE `recruit_users` ( `id` ...

  5. 基于硬件的消息队列中间件 Solace 简介之二

    前言...... 前面简单介绍了Solace来自于哪家公司, 主要能做哪些事情. 本篇主要进一步介绍Solace作为消息传递的中间件如何工作的. 传统意义上来讲, 每当我们谈到消息中间件时, 首先想到 ...

  6. PHP【Laravel】delayer基于redis的实现订单超时改变状态

    实现这个功能前你需要知道以下,不然可能会比较吃力:1.服务器的计划任务,shell脚本,或者你有宝塔自带的计划任务会方便很多.2.有所了解Redis.3.会写PHP业务逻辑. 好了进入在正题,这里使用 ...

  7. Redis 学习笔记(六)Redis 如何实现消息队列

    一.消息队列 消息队列(Messeage Queue,MQ)是在分布式系统架构中常用的一种中间件技术,从字面表述看,是一个存储消息的队列,所以它一般用于给 MQ 中间的两个组件提供通信服务. 1.1 ...

  8. .NET Core微服务之基于EasyNetQ使用RabbitMQ消息队列

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.消息队列与RabbitMQ 1.1 消息队列 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...

  9. 常用的消息队列中间件mq对比

    原文地址:https://blog.csdn.net/qq_30764991/article/details/80239076 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量 ...

随机推荐

  1. Kali linux 2016.2(Rolling)中的Metasploit如何更新与目录结构初步认识

    如何更新MSF 1.Windows平台 方法1: 运行msfupdate.bat 在msfconsole里执行命令svn update 或者 方法2:  2.unix/linux平台 方法1: 运行m ...

  2. SAS小记

    2011年8月13日 最近一直在跟着李东风的<统计软件教程>学习SAS,刚刚学完初等统计,感觉还没入门,找不到matlab编程时那种手顺的感觉.继续学习吧,加油!     最近用spss处 ...

  3. mybatis与spring整合配置

    mybatis与spring整合配置: 第一种方式:(此处配置扫描的包路径.注解.每个mapper类上面需要加@Repository才能纳入spring的bean管理器中) <!-- 自动扫描m ...

  4. Django(part4)

    一个简单的form表单: #polls/templates/polls/detail.html<h1>{{ question.question_text }}</h1> {% ...

  5. Net Core链接数据库

    原文 在Windows下,相信大家分分钟都可以搞定.而初次接触.net core + mysql可能需要注意些细节.首先打开vs2017新建一个asp.net core项目(选Web应用程序), 然后 ...

  6. oracle动态磁盘管理

    一.ASM发展: oracle 想做硬件: 收购sum公司的小型机业务 推出一体机Exadata 1.sum服务器 2.磁盘柜(没做存储) 推出asm建库方式配合一体机(自动使用磁盘柜的盘)(抛弃ra ...

  7. BZOJ 4199: [Noi2015]品酒大会 后缀自动机_逆序更新

    一道裸题,可以考虑自底向上去更新方案数与最大值. 没啥难的 细节........ Code: #include <cstdio> #include <algorithm> #i ...

  8. [USACO10FEB]吃巧克力Chocolate Eating

    题目:洛谷P2985. 题目大意:有n块巧克力要吃d天,并且只能按顺序吃.一块巧克力有一个开心值,吃了就能增加开心值.一个人初始开心值为0,且每天早上开心值变为原来的一半.问如何吃巧克力才能使开心值最 ...

  9. python编写登录与注册

    #编写简单的注册与登陆模块 #使用死循环来检测 while True: #如果条件为真,则一直循环 sum=3 #定义密码输入的次数 username = input("请输入用户名:&qu ...

  10. hadoop-15-Ambari进行HDP、zookeeper安装

    hadoop-15-Ambari进行HDP.zookeeper安装 1,登陆server_1:8080 admin/admin 2,命名:Hdp_cluster 3,输入HDP.HDP_Utils 地 ...