分布式高可用id服务器设计实现

标签: 分布 id 服务器 | 发表时间:2015-09-17 14:09 | 作者:star
出处:http://www.cppblog.com/
服务端/后台开发中如何生成id是每个开发者都会遇到的问题,在电商、游戏领域尤其突出。
如何保证生成id的唯一性、可靠性、高可用性,如何组织id的格式,在不同的应用场景和限制下实现方式也不尽相同。

我们的应用场景类似电商,在一个订单的生命周期内,有多个逻辑需要生成各自的id,还要考虑到可读性和灵活性,我们决定实现一个独立的id服务。
首先,id服务必须具有高可用性,业务逻辑处理中创建id失败是不可接受的,所以id服务必须分布式部署,有多个节点同时对外服务,一个节点失败则重试其他节点,保证成功创建id。
在分布式系统中保证数据的一致性成本是很高的,为了简化设计和实现,每个节点都设计成对等的、独立的,不需要保持数据同步。
其次,id服务必须可靠,数据不能丢失,因此数据的存储放在独立的mysql数据库中,使用replace方式更新数据,id服务本身记录更新日志。
最后,id服务必须灵活,可以自定义id格式,可以高效灵活的实现客户端,因此通讯协议使用json over udp方式,在id服务端使用lua实现id格式的灵活定义。
ID规则
    具体规则有lua脚本定义,修改脚本后需要reload生效,需要实现4个函数
    min_counter :   计数器最小值
    max_counter :   计数器最大值
    reset_seconds : 计数器重置周期
    create_id : 根据计数器、自定义参数和时间参数创建ID。
接口
    采用udp协议,数据格式为json ,字段定义:
    action: 请求类型 get: 创建ID ,  monitor:监控
    rule_name: 规则名字, 由服务端定义
    app_name : 应用名或命名空间 , 客户端自定义,rule_name和app_name一起决定生成ID的唯一性
    salt :  自定义参数 ,可选项 ,
    seq : 自定义参数,可选项,原样返回
性能
    id服务器使用c++实现,性能测试做的比较简单,因为性能不是id服务的主要关注点, 简单以php为客户端进行测试。
    4个php并发进程,每个进程不停发送20万个请求,测试结果:
    total:200000 fail:0 min:0.000214 max:0.087330 avg:0.000393
    total:200000 fail:0 min:0.000215 max:0.087129 avg:0.000391
    total:200000 fail:0 min:0.000221 max:0.087252 avg:0.000391
    total:200000 fail:0 min:0.000218 max:0.087484 avg:0.000391
    说明  min : 最小耗时(秒) max : 最大耗时(秒) avg : 平均耗时(秒)
    服务器TPS达到近1万/秒时,平均延迟在0.3毫秒。

经过在生产环境使用,运行稳定,现在将整个系统开源出来,欢迎试用,有任何意见和建议欢迎反馈到lxyfirst@163.com 。
项目源代码位置 : https://github.com/lxyfirst/id_server


star 2015-09-17 14:09 发表评论

相关 [分布 id 服务器] 推荐:

分布式高可用id服务器设计实现

- - C++博客-首页原创精华区
服务端/后台开发中如何生成id是每个开发者都会遇到的问题,在电商、游戏领域尤其突出. 如何保证生成id的唯一性、可靠性、高可用性,如何组织id的格式,在不同的应用场景和限制下实现方式也不尽相同. 我们的应用场景类似电商,在一个订单的生命周期内,有多个逻辑需要生成各自的id,还要考虑到可读性和灵活性,我们决定实现一个独立的id服务.

Twitter的分布式自增ID算法Snowflake

- - 企业架构 - ITeye博客
Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的id必须不同. Snowflake算法核心. 把 时间戳, 工作机器id, 序列号组合在一起.

Leaf——美团点评分布式ID生成系统

- - 美团点评技术团队
在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求;特别一点的如订单、骑手、优惠券也都需要有唯一ID做标识. 此时一个能够生成全局唯一ID的系统是非常必要的.

SnowFlake 分布式ID生成算法Java实现

- - ITeye博客
SnowFlake 分布式ID生成Java实现. SnowFlake不依赖第三方介质,不像基于ZK,Redis等,每次用完一个区间还得通过网络去获取下一个区间,效率较低,基于SnowFlake的分布式ID生成是目前我见过的最快的. SnowFlake生成的是一个64位的数字,其中42位时间戳,接下来10位是自定义的数,其作用就是区分集群中的所有机器,最后12位是毫秒内序列,集群内每个机器能够在1毫秒内生成2^12 - 1个ID.

分布式系统中唯一 ID 的生成方法

- - 文章 – 伯乐在线
本文主要介绍在一个分布式系统中, 怎么样生成全局唯一的 ID. 在分布式系统存在多个 Shard 的场景中, 同时在各个 Shard 插入数据时, 怎么给这些数据生成全局的 unique ID?. 在单机系统中 (例如一个 MySQL 实例), unique ID 的生成是非常简单的, 直接利用 MySQL 自带的自增 ID 功能就可以实现..

分布式系统中, 怎么样生成全局唯一的 ID

- - zzm
在分布式系统存在多个 Shard 的场景中, 同时在各个 Shard 插入数据时, 怎么给这些数据生成全局的 unique ID?. 在单机系统中 (例如一个 MySQL 实例), unique ID 的生成是非常简单的, 直接利用 MySQL 自带的自增 ID 功能就可以实现.. 但在一个存在多个 Shards 的分布式系统 (例如多个 MySQL 实例组成一个集群, 在这个集群中插入数据), 这个问题会变得复杂, 所生成的全局的 unique ID 要满足以下需求:.

产生Id

- - 研发管理 - ITeye博客
// worker编号最大值,决定支持的部署节点数量. // 毫秒内自增位数,每毫秒最大序号支持65535. // worker编号偏移量. // 毫秒基线:2015-01-01 00:00:00. * 从环境变量中获取worker编号,每个部署环境编号不能重复. * 每个部署环境编号不能重复. * @param workerId Worker编号.

id Software发布《狂怒(Rage)》

- ArmadilloCommander - Solidot
id Software发布了容量为21GB的第一人称射击游戏《狂怒(Rage)》. 游戏基于id Tech 5引擎,背景是世界末日后的未来. 目前对它的评价好坏参半,媒体综合评分80左右,玩家评分相似或更低. 在游戏中,玩家将扮演一位小行星Apophis撞击地球后的幸存者. 在灾难发生前,全世界展开合作将包括科学家在内的精英冰冻在地下,以在灾难后重建地球.

小米手机ID简介

- miyizs - Billwang 工业设计
      小米手机是小米公司(全称北京小米科技有限责任公司)专为发烧友级手机控打造的 一款高品质智能手机. 下面我们将对其做一个简单的介绍.       小米手机的外观设计走的是简约内敛路线,直板加圆润的边角让其显得简单清爽. 小米手机配置了,1.5GHz双核处理器、1G RAM、4英寸夏普屏、800万像素摄像头以及大容量电池.