PostgreSQL 高并发任务分配系统 实践

标签

PostgreSQL , 高并发消费 , pg_try_advisory_xact_lock , 秒杀 , 任务分配


背景

给任务分配线程ID,或让线程去抢占任务执行,是任务分配系统中的基本需求。

目的是能够快速的消耗掉所有的任务,同又要保证两点:

1、所有任务都被领取。

2、每个任务只能被一个线程领取。

3、每个线程同一时间只能领取一个任务。

实际上在数据库中, 就是一个高并发的,实时更新系统,设计时要尽量避免冲突,提高处理吞吐。

PostgreSQL的UDF,advisory lock是一个很好的功能点,可以实现高并发、高可靠的任务分配。

其中,秒杀例子:

《HTAP数据库 PostgreSQL 场景与性能测试之 30 - (OLTP) 秒杀 - 高并发单点更新》

给任务分配唯一JAVA线程

例子1

功能描述:

有1000个java线程/进程,需要为具体的某个任务选举出一个master,并把选举结果写入到table中,记录任务ID与master线程/线程ID。

或者说:1每个任务的选举都被投票一次;2每个任务都只有一个master。

如果某个线程已经是某个任务的master,那这个线程/进程不参与选举。

1、JAVA线程与任务ID对应关系表

create table java_pool (
  tid int primary key ,    -- JAVA 线程ID
  taskid int unique        -- 任务 ID
);

2、插入1000个线程ID

insert into java_pool select generate_series(1,1000);

3、输入任务ID,返回JAVA线程ID,表示这个任务分配给某个JAVA线程ID。

create or replace function set_master(v_taskid int) returns int as $$
declare
  res int;
begin
  -- set lock_timeout = '10 ms';
  -- 使用adlock,消除唯一约束时的等待以及更新时的锁等待。
  update java_pool set taskid=$1
  where tid in
  (select tid from java_pool where pg_try_advisory_xact_lock(tid) and pg_try_advisory_xact_lock($1) and taskid is null limit 1)
  and pg_try_advisory_xact_lock($1)
  returning tid into res;  

  return res;  

  exception when unique_violation then
    return -1;  -- this task already set other tid
  when others then
    return -2;  -- lock timeout, other session is setting the same taskid.
end;
$$ language plpgsql strict;

释放TID

update java_pool set taskid=null where tid=? and pg_try_advisory_xact_lock(?) and taskid is not null;

4、压测

vi test.sql  

\set taskid random(100,100000)
\set tid random(1,1000)
select set_master(:taskid);
update java_pool set taskid=null where tid=:tid and pg_try_advisory_xact_lock(:tid) and taskid is not null;

5、压测结果

pgbench -M prepared -n -r -P 1 -f ./test.sql -c 32 -j 32 -T  120  

transaction type: ./test.sql
scaling factor: 1
query mode: prepared
number of clients: 32
number of threads: 32
duration: 120 s
number of transactions actually processed: 6876049
latency average = 0.558 ms
latency stddev = 0.508 ms
tps = 57298.823054 (including connections establishing)
tps = 57301.470302 (excluding connections establishing)

例子2

功能描述:

在一个table中,每一行记录了一个任务,需要把每个任务分配一个java执行线程/进程。

总的线程数/进程数多于任务数,并要求在table中记录当前任务分配到的线程/进程ID。

或者说,是多个java线程/进程需要争抢一个任务,需要某个方式实现: 1每个任务都被争抢到;2每个任务只被一个java线程/进程争抢到。

10万任务(已知)

100万线程(ID未知)

1、建表

create table task_pool (
  taskid int primary key ,    -- 任务ID
  tid int unique              -- JAVA 线程ID
);

2、插入10万任务ID

insert into task_pool select generate_series(1,100000);

3、输入JAVA线程ID,返回任务ID。表示这个任务分配给某个JAVA线程ID。

create or replace function set_tid(v_tid int) returns int as $$
declare
  res int;
begin
  -- set lock_timeout = '10 ms';
  update task_pool set tid=$1
  where taskid in
  (select taskid from task_pool where pg_try_advisory_xact_lock(taskid) and pg_try_advisory_xact_lock($1) and tid is null limit 1)
  and pg_try_advisory_xact_lock($1)
  returning taskid into res;  

  return res;  

  exception when unique_violation then
    return -1;  -- this task already set other tid
  when others then
    return -2;  -- lock timeout, other session is setting the same taskid.
end;
$$ language plpgsql strict;

4、压测

vi test.sql  

\set tid random(1,1000000)
select set_tid(:tid);

5、压测结果,约6秒分配完10万任务。

pgbench -M prepared -n -r -P 1 -f ./test.sql -c 32 -j 32 -T 120  

progress: 1.0 s, 42693.2 tps, lat 0.733 ms stddev 0.333
progress: 2.0 s, 41831.7 tps, lat 0.765 ms stddev 0.285
progress: 3.0 s, 38475.0 tps, lat 0.832 ms stddev 1.544
progress: 4.0 s, 39560.5 tps, lat 0.809 ms stddev 0.276
progress: 5.0 s, 36850.0 tps, lat 0.868 ms stddev 0.317
progress: 6.0 s, 32344.5 tps, lat 0.989 ms stddev 0.720
progress: 7.0 s, 16541.2 tps, lat 1.934 ms stddev 0.579
progress: 8.0 s, 17078.0 tps, lat 1.875 ms stddev 0.575

例子3

如果任务ID和JAVA 线程ID都不是预先生成的,那么同样可以使用类似的功能点提高并发和可靠性。

使用pg_try_advisory_xact_lock来提高并发,降低等待。

insert into tbl select $1,$2 where pg_try_advisory_xact_lock($1) and pg_try_advisory_xact_lock($2) returning *;  

根据结果判定是否锁定任务和JAVA线程ID
时间: 2024-08-04 04:15:37

PostgreSQL 高并发任务分配系统 实践的相关文章

大流量高并发互联网应用实践在线峰会:资料汇总(更新ing~)

2015阿里双11交易额912.17亿,开发者一直渴望获得更多阿里双11背后的技术实现与实践,为此我们精心策划了阿里双11在线技术大会,本次大会将于9月20日-21日20:00-21:30在线举办.  10位淘宝开放平台和阿里云技术大V,揭秘双11背后的海量订单时实同步与处理 .大数据驱动的客户运营 .聚石塔容器技术实践.千牛旺旺的云到端. RDS数据库.ODPS.中间件.负载均衡等绝密技术.  阿里双11首届在线技术大会官网:https://yq.aliyun.com/activity/112

【干货合集】大流量与高并发:数据库、架构与实践技巧

峰会专题:https://yq.aliyun.com/activity/112 报名入口:http://yq.aliyun.com/webinar/join/49?spm=5176.8155509.437644.12.F2Xi5N 从2009年第一届双十一购物节到2015年双十一全天912.17亿元的交易额,"双十一"当天订单创建峰值增长了350倍(每秒14万笔),支付峰值 (每秒8.59万笔)增长了430倍.为了保证越来越多购物者的用户体验,在IT基础设施上,阿里一次又一次地遭遇并超

【干货合集】大流量与高并发:双11技术盘点(二)

峰会专题:https://yq.aliyun.com/activity/112 报名入口:http://yq.aliyun.com/webinar/join/49?spm=5176.8155509.437644.12.F2Xi5N 从2009年第一届双十一购物节到2015年双十一全天912.17亿元的交易额,"双十一"当天订单创建峰值增长了350倍(每秒14万笔),支付峰值 (每秒8.59万笔)增长了430倍.为了保证越来越多购物者的用户体验,在IT基础设施上,阿里一次又一次地遭遇并超

9月20-21日,十位阿里技术大牛带你玩转大流量与高并发

据工信部公布的<2016年1月份通信业经济运行情况>显示,2016年1月,中国移动互联网用户总数达9.8亿户,其中移动互联网接入流量累计达5.4亿G,同比增长120.9%.,固定宽带接入时长达4.8万亿分钟.越来越多的用户及在线时间为业务突破和创新带来了无限可能,然而设计和打造支撑海量用户的应用却成为各个机构不得不面对的问题. 负载均衡.数据库.中间件.大数据,如何将技术演绎到极限? 从2009年第一届双十一购物节到2015年双十一全天912.17亿元的交易额,"双十一"当

HTAP数据库 PostgreSQL 场景与性能测试之 29 - (OLTP) 高并发空间位置更新(含空间索引)

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

HTAP数据库 PostgreSQL 场景与性能测试之 30 - (OLTP) 秒杀 - 高并发单点更新

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

PostgreSQL 9.6 scale-up高并发增强 VS 9.5

PostgreSQL 9.6 scale-up高并发增强 VS 9.5 作者 digoal 日期 2016-10-02 标签 PostgreSQL , 9.6 , scale-up , 高并发 , 多核增强 背景 PostgreSQL 在向和纵向的扩展能力在开源数据库中一直处于非常领先的地位,例如今年推出的9.6,内置了sharding的功能,同时在scale-up的能力也有非常明显的提升,特别是在多核与高并发处理这块. 社区有同学在128核的机器上测试tpc-b的select only模式可以

基于MongoDB的高并发高可用政府云平台架构实践

3月12日下午在阿里巴巴西溪园区,举行了MongoDB杭州用户交流会.微软MSDN特邀讲师徐雷分享<基于MongoDB的政府云平台高并发高可用HA架构实践 >,从自身实践出发,讲述了政府云平台分层.技术栈选型.物理架构.API架构及DB数据库架构的设计思路和方法.   以下内容根据现场分享和演讲PPT整理而成.   学习MongoDB的重要性 目前,几乎所有国内外的互联网大公司都在用MongoDB,学习企业需要的技术很重要.   MongoDB优点   相比较关系型数据库而言,MongDB有两

97期:大流量与高并发—双11技术盘点

本期头条   [峰会回顾]8月30-31日我们成功举办了"蚂蚁金服&阿里云在线金融技术峰会",本次峰会聚焦数据库.应用架构.移动开发.机器学习等热门领域,帮助金融业技术开发者深入解析互联网应用的前沿应用与技术实践.目前活动视频.整理文章已经出炉,点击收藏. • 大流量与高并发:双11技术盘点 • 阿里云开源DataX 3.0:异构数据源离线同步工具,支持10余款主流开源数据库 最新资讯   阿里云中标国税总局大数据专有云项目,中标金额近四千万元点击查看 据中国政府采购网公示消息