实现原理
使用最大锁定次数来控制最大并发数,请求前先进行Lock操作,请求完成后进行Unlock操作,超过最大锁定次数会进入等待,等待超时则出错返回,此时可以达到控制最大并发请求的目的。
高性能分布式状态同步与原子操作数据库。通过锁队列、高性能异步二进制网络协议提供良好的多核支持。 可用于尖峰、同步、事件通知、并发控制等。支持Redis客户端。
https://github.com/snower/slock
1 | package main; |
在实际开发中我们经常会遇到需要长时间等待后台事件的情况,例如较为常见的扫码登录功能,二维码界面需等待后台扫码登录成功的事件,再如导入导出等需要较长时间才能处理完成的任务,此时需要把任务放到后台由异步任务进行处理,完成后再给前台界面推送完成事件,以上需求我们需要用长连接才能完成推送,但长连接推送状态管理复杂,且需要部署独立系统,系统流程复杂且横向水平扩展困难,此时选择更简单long polling等待是一个更好的选择,http请求直接等待返回,显然逻辑更简单,可用性可维护性也会更高。
openresty是一个构建在nginx上的高性能能系统,一般情况下我们也需要在自身服务前部署nginx作为网关,那么选择openresty来构建一个高性能的long polling服务显然是一个好选择。slock是高性能的状态及原子操作数据库,redis则是高性能的内存缓存数据库,使用下边nginx配置文件即可快速基于slock和redis构建一个高性能高可用long polling服务。同时构建的此long polling服务是一个通用服务,即可用于扫码登录这样的需求完成状态推送,也可用于像消息系统、私信系统等的消息推送。
slock项目地址:https://github.com/snower/slock
项目地址:https://github.com/snower/slock
何为状态与原子操作数据库?区别于redis主要用于保存数据,可在多节点多系统间高效统同步数据,slock则是设计为只用于保存同步状态,几乎不能携带数据,高性能的异步二进制协议也保证了在状态达成时高效的主动触发等待系统。区别于redis被动检查的过期时间,slock的等待超时时间及锁定过期时间都是精确主动触发的。多核支持、更简单的系统结构也保证了其拥有远超redis的性能及延时,这也更符合状态同步需求中更高性能更低延时的需求。
秒杀为何难做?其问题就是我们需要在很短时间内完成大量的无效请求中夹杂仅很少的有效请求处理,进一步简化就是需要完成超高并发下海量请求间的状态同步的过程,slock高QPS可以快速解决过滤大量无效请求的问题,高性能的原子操作又可以很好的解决抢库存的逻辑。
随着nodejs的使用,异步IO相关框架也越来越成熟,使用也越来越方便,多线程同步IO模式下,某些场景很多时候我们需要转化为队列处理然后再推送结果,但异步IO就完全不需要这么复杂,直接加分布式锁等待可用就行,整个过程完全回到了单机多线程编程的逻辑,更简单也更容易理解和维护了,比如下单请求需要操作很多,在高并发下可能需要发送到队列中处理完成再推送结果,但用异步IO的加分布式锁话,仔细看异步IO加锁其实又组成了一个更大的分布式队列,大大简化了实现步骤。
forsun是一个高性能高精度定时服务,可以轻松管理千万级定时任务。
项目地址: https://github.com/snower/forsun
或者看看高性能千万级定时任务管理服务forsun使用详解
forsun内置支持 shell、http、redis、thrift、beanstalk、mysql 六种到时触发回调执行器,但是很多时候自己的项目需求千奇百怪,单一的内置执行器并不能很好的在自己的项目中整合,所以forsun也支持通过扩展Extension开发的方式将自己编写的触发执行器Action注册进去。
那么我们就来轻松愉快实现一个整合celery的扩展吧。
forsun高性能高精度定时服务,轻松管理千万级定时任务。
定时服务项目地址:https://github.com/snower/forsun
laravel插件项目地址: https://github.com/snower/forsun-laravel
forsun高性能高精度定时服务,轻松管理千万级定时任务。
项目地址: https://github.com/snower/forsun