0%

实现原理

使用最大锁定次数来控制最大并发数,请求前先进行Lock操作,请求完成后进行Unlock操作,超过最大锁定次数会进入等待,等待超时则出错返回,此时可以达到控制最大并发请求的目的。

阅读全文 »

实现原理

设置最大锁定数为令牌数,初始即为所有令牌都可用,过期时间设置为全部令牌发放的周期,请求前先进行Lock操作,请求完成后不进行Unlock操作,请求前进行的Lock会在过期后重置,此操作可认为令牌重置,此时该令牌可被先请求使用,保证时间周期内只能完成指定请求个数。

在较长的时间周期中如需完成时间对齐,可先进行一次超时时间设置为0,过期时间设置为距离下次重置时间的剩余时间,如果进行Lock操作返回超时,则表示当前时间周期令牌已用尽,如等待超时时间还大于剩余时间,可再次进行Lock操作,此时超时时间设置为等待超时的时间,过期时间设置为令牌周期,即可完成令牌时间周期对齐。

阅读全文 »

高性能分布式状态同步与原子操作数据库。通过锁队列、高性能异步二进制网络协议提供良好的多核支持。 可用于尖峰、同步、事件通知、并发控制等。支持Redis客户端。

https://github.com/snower/slock

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main;

import io.github.snower.jaslock.Client;
import io.github.snower.jaslock.Event;
import io.github.snower.jaslock.Lock;
import io.github.snower.jaslock.ReplsetClient;
import io.github.snower.jaslock.exceptions.SlockException;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class App {
public static void main(String[] args) {
ReplsetClient replsetClient = new ReplsetClient(new String[]{"172.27.214.150:5658"});
try {
replsetClient.open();
Lock lock = replsetClient.newLock("test".getBytes(StandardCharsets.UTF_8), 5, 5);
lock.acquire();
lock.release();
} catch (SlockException e) {
e.printStackTrace();
} finally {
replsetClient.close();
}
}
}

Client库

文章

为啥需要?

在实际开发中我们经常会遇到需要长时间等待后台事件的情况,例如较为常见的扫码登录功能,二维码界面需等待后台扫码登录成功的事件,再如导入导出等需要较长时间才能处理完成的任务,此时需要把任务放到后台由异步任务进行处理,完成后再给前台界面推送完成事件,以上需求我们需要用长连接才能完成推送,但长连接推送状态管理复杂,且需要部署独立系统,系统流程复杂且横向水平扩展困难,此时选择更简单long polling等待是一个更好的选择,http请求直接等待返回,显然逻辑更简单,可用性可维护性也会更高。

openresty是一个构建在nginx上的高性能能系统,一般情况下我们也需要在自身服务前部署nginx作为网关,那么选择openresty来构建一个高性能的long polling服务显然是一个好选择。slock是高性能的状态及原子操作数据库,redis则是高性能的内存缓存数据库,使用下边nginx配置文件即可快速基于slock和redis构建一个高性能高可用long polling服务。同时构建的此long polling服务是一个通用服务,即可用于扫码登录这样的需求完成状态推送,也可用于像消息系统、私信系统等的消息推送。

slock项目地址:https://github.com/snower/slock

slock简介可看:https://segmentfault.com/a/1190000041148625

阅读全文 »

概述

项目地址: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

  • 轻松支持千万级定时任务调度。
  • 定时任务触发推送到Queue,轻松支持跨机器和共性能分布式。
  • 支持任务到期触发command、Job、Shell、Http和Event。
  • 支持驱动原生Laravel Schedule运行。
  • 支持创建延时任务和定时到期任务,和原生Laravel Schedule保持相同接口,轻松使用。
阅读全文 »

forsun高性能高精度定时服务,轻松管理千万级定时任务。
项目地址: https://github.com/snower/forsun

  • 使用 linux 系统定时器提供精确到秒级的定时调度,长时间运行保证无误差。
  • 支持本地内存存储和 redis 持久化存储,使用 redis 可轻松管理数千万定时任务。
  • 支持命令行创建删除任务,支持Apache Thrift接口调用创建和删除更新定时任务信息。
  • 支持 shell、http、redis、thrift、beanstalk、mysql 六种到时触发回调方式,并可以通过扩展轻松自定义回调器。
阅读全文 »