Home

美图开源任务队列 - LMSTFY

lmstfy(Let Me Schedule Task For You) 是美图架构基础服务团队在 2018 年初基于 Redis 实现的简单任务队列(Task Queue)服务,目前在美图多个线上产品使用接近两年的时间。主要提供以下特性: 任务具备延时、自动重试、优先级以及过期等功能 通过 HTTP restful API 提供服务 具备横向扩展能力 丰富的业务和性能指标 Github 项目地址: https://github.com/meitu/lmstfy 使用场景 任务队列跟消息队列在使用场景上最大的区别是: 任务之间是没有顺序约束而消息要求顺序(FIFO),且可能会对任务的状态更新而消息一般只会消费不会更新。 类似 Kafka 利用消息 FIFO ...

Read more

Redis 6 多线程 IO

前天晚上不经意间在 youtube 上面看到 Redis 作者 Salvatore 在 RedisConf 2019 分享,其中一段展示了 Redis 6 引入的多线程 IO 特性对性能提升至少是一倍以上,内心很是激动,迫不及待地去看了一下相关的代码实现。 目前对于单线程 Redis 来说,性能瓶颈主要在于网络的 IO 消耗, 优化主要有两个方向: 提高网络 IO 性能,典型的实现像使用 DPDK 来替代内核网络栈的方式 使用多线程充分利用多核,典型的实现像 Memcached 协议栈优化的这种方式跟 Redis 关系不大,多线程特性在社区也被反复提了很久后终于在 Redis 6 加入多线程,Salvatore 在自己的博客 An update about Redis...

Read more

美图多线程 twemproxy 实现

美图在 2017 年下半年开始计划做 Redis/Memcached 资源 PaaS 平台,而 PaaS 化之后面临一个问题是如何实现资源缩容/扩容对业务无感,为了解决这个问题,美图技术团队于 17 年 11 月引入 twemproxy 作为资源网关。 但是长期的实践中,其开源版本不能完全适应美图的实际情况,其主要存在单线程模型无法利用多核,性能不佳;配置无法在线 Reload ;Redis 不支持主从模式;无延时指标等问题,所以美图技术团队对其进行了相应的改造。我们基于之上实现了多进程以及配置在线更新的功能,同时增加了一些延时的相关监控指标。 本文将为大家详细讲解 twemproxy 实现以及相应地改造,希望能给其他的技术团队提供一些可以借鉴的经验。 为什么要选择 twempr...

Read more

Redis 4.0 非阻塞删除

对于 Redis 这种单线程模型的服务来说,一些耗时的命令阻塞其他请求是个头痛的问题。典型的命令如 KEYS/FLUSHALL/FLUSHDB 等等,一般线上也会禁用这些会遍历整个库的命令。而像 DEL/LRANGE/HGETALL 这些可能导致阻塞的命令经常被工程师忽视,这些命令在 value 比较大的时候跟 KEYS 这些并没有本质区别。 Redis 4.0 开始针对 DEL/FLUSHALL/FLUSHDB 做了一些优化。 1) DEL/FLUSHALL/FLUSHDB 异步化 FLUSHALL/FLUSHDB 清除库的时候因为要对每个 kv 进行遍历会比较耗时。同理对于 DEL 命令也是,如 VALUE 是链表,集合或者字典,同样要遍历删除。在 Redis 4.0 针对这...

Read more

Redis 4.0 RDB 和 AOF 混合存储

Redis 当前支持 aof 和 rdb 这两种持久化方式。 有些对 Redis 不是特别的了解同学误解持久化是读写数据也会到磁盘。这里辟谣一下: Redis 读写都是全内存的, 持久化数据只是作为磁盘备份, 实例重启或者机器断电的时候可以从磁盘加载到内存 由于本篇博客主要是为了分析 4.0 版本的 rdb 和 aof 混合存储的实现,所以不会详细介绍 rdb 和 aof。如果有想进一步了解可参考 《Redis 设计与实现》 一书。 1) aof 和 rdb 1.1) rdb 简介 rdb 是某一个时刻的内存镜像数据写入到磁盘文件,之后的写入数据会丢失。 rdb 持久化方式的优点是持久化后的文件比较小(只有某一个时刻的数据且会压缩),实例重启时加载会更快。缺点是如果实...

Read more

Redis 4.0 psync 优化

上一篇介绍了 [](http://www.hulkdev.com/posts/redis-module),同时也提到 redis 4.0 一个比较大的改动就是 psync 优化, 本篇会介绍这个优化的部分。 在 2.8 版本之前 redis 没有增量同步的功能,主从只要重连就必须全量同步数据。如果实例数据量比较大的情况下,网络轻轻一抖就会把主从的网卡跑满从而影响正常服务,这是一个蛋疼的问题。2.8 为了解决这个问题引入了 psync (partial sync)功能,顾名思义就是增量同步。 1) 2.8 版本的 psync 机制 2.8 引入 psync 之后的同步机制: 从库尝试发送 psync 命令到主库,而不是直接使用 sync 命令进行全量同步 主库判断是否满...

Read more

Redis 4.0 模块功能

直到今天为止 (2017-01-17) Redis 4.0 已经发布了两个 rc 版本, 相比于上个版本(3.2),这个版本的改动应该说是巨大的。主要有以下几个点: 增加了模块的功能, 用户可以自己扩展命令和数据结构 psync 优化,避免主从切换过程需要重新全量同步 DEL, FLUSHALL/FLUSHDB异步化,不会阻塞主线程 RDB-AOF 混合持久化 新增 MEMORY 命令 集群兼容 NAT / Docker 每个功能都很值得期待,本篇博客会重点来介绍 Redis 的模块功能。 1) 为什么引入模块 下面是引用 Redis 作者的一段说明: 「At the same time, years of experience with ...

Read more

php consumergroup 介绍

知道或者熟悉 kafka(不是写小说的那个卡夫卡), 那么一定知道它有 producer 和 consumer 这两种角色。producer 用来生产消息,consumer 用来消费消息。 1) 可用性 下面是来自维基百科的解释: 在一个给定的时间间隔内,对于一个功能个体来讲,总的可用时间所占的比例 比如我们以年为单位来量化一个服务的可用性。假设一年 365 天当中有 364 天服务是正常服务的,那么我们就说这个服务的可用性是 364/365(用计算器口算了一下约 99.72%)。 我们常用几个 9 来衡量一个服务的可用性,两个 9 就是 99.99%,三个 9 即 99.999%, 四个 9 即 99.9999% … 以此类推。 可用...

Read more