亿级消息系统的核心存储:Tablestore发布Timeline 2.0模型

背景

互联网快速发展的今天,社交类应用、消息类功能大行其道,占据了大量网络流量。大至钉钉、微信、微博、知乎,小至各类App的推送通知,消息类功能几乎成为所有应用的标配。根据场景特点,我们可以将消息类场景归纳成三大类:IM(钉钉、微信)、Feed流(微博、知乎)以及常规消息队列。因此,如何开发一个简便而又高效IM或Feed流功能,成为了很多架构师、开发人员不得不面对的问题。

Timeline 1.0版模型

针对消息类场景,表格存储团队针对JAVA语言打造了一个TableStore-Timeline 1.0版数据模型模型(简称Timeline模型)。基于场景经验与理解,将消息场景封装成一个数据模型,提供了表结构设计,读写方式等解决方案供需求者使用。用户只需依托模型API,直接忽略Timeline到底层存储系统之间的架构方案,直接基于接口实现业务逻辑。它能满足消息数据场景对消息保序、海量消息存储、实时同步等特殊需求。Timeline 1.0是定义在表格存储之上抽象出来的数据模型,具体内容参见《TableStore Timeline:轻松构建千万级IM和Feed流系统》。

全文检索、模糊查询需求

在表格存储的Timeline模型受到广泛使用的过程中,我们也逐渐发现消息类数据的全文检索、模糊查询这一很强需求。而原有模型的在线查询能力存在一定短板。随着表格存储支持了SearchIndex能力,使得Timeline模型支持在线全文检索、模糊查询成为了可能。所以我们基于原有的架构设计,重新打造了Timeline 2.0模型,引入了强大的查询能力与数据管理新方案。

项目代码目前已经开源在了GitHub上:Timeline@GitHub。

2.0时代到来

此次推出的Timeline模型2.0版,没有直接基于1.X版本直接改造。而是在兼容原有模型架构之上,定义、封装了新的使用接口。重新打造升级新的模型,增加了如下功能:

  • 增加了Timeline Meta的管理能力;
  • 基于多元索引功能,增加了Meta、Timeline的全文检索、多维组合查询能力;
  • 支持SequenceId两种设置方式:自增列、手动设置;
  • 支持多列的Timeline Identifier设置,提供Timeline的分组管理能力;
  • 兼容Timeline 1.X模型,提供的TimelineMessageForV1样例可直接读、写1.X版本消息,用户也可仿照实现。

架构解析

Timeline做为表格存储直接支持的一种数据模型,以『简单』为设计目标,其存核心模块构成比较清晰明了。Timeline尽量提升用户的使用自由度,让用户能够根据自身场景需求选择更为合适的实现方案。模型的模块架构如上图,主要包括如下重要部分:

  • Store:存储库,类似数据库的表的概念,模型包含两类Store分别为Meta Store、Timeline Store。
  • Identifier:用于区分Timeline的唯一标识,用以标识单行Meta,以及相应的Timeline Queue。
  • Meta:用于描述Timeline的元数据,元数据描述采用free-schema结构,可自由包含任意列。
  • Queue:Queue为单Identifier对应的所有消息队列,一个Timeline下Message按照Queue单元存储。
  • SequenceId:Queue中消息体的序列号,需保证递增、唯一,模型支持自增列、自定义两种实现模式。
  • Message:Timeline内传递的消息体,是一个free-schema的结构,可自由包含任意列。
  • Index:基于SearchIndex实现的索引,针对不同Store分为Meta Index和Message Index两类,可对Meta或Message内的任意列自定义索引,提供灵活的多条件组合查询和搜索。

性能优势

Timeline 模型是基于Tablestore抽象、封装出的一类场景数据模型,因而具有Tablestore自身的所有优点。同时结合场景设计的接口,让用户更直观、清晰的实现业务逻辑,总结如下:

  • 支撑海量数据存储:分布式架构,高可扩展,支持10PB级的消息。
  • 低存储成本:表格存储提供低成本的存储方式,按量付费、资源包、预留Cu。
  • 数据生命周期管理:不同类型(表级别)消息数据,可自定义不同生命周期。
  • 极高的写入吞吐:具备极高的写入吞吐能力,可应对00M TPS的消息写入。
  • 低延迟的读:查询消息延迟低,毫秒量级。
  • 接口设计:可读性高,接口功能全面、清晰。

Maven地址

Timeline Lib

<dependency><groupId>com.aliyun.openservices.tablestore</groupId><artifactId>Timeline</artifactId><version>2.0.0</version>
</dependency>

TableStore Java SDK

Timeline模型在TableStore Java SDK >= 4.12.1作为基本数据模型直接提供,表格存储老用户可升级SDK直接使用

<dependency><groupId>com.aliyun.openservices</groupId><artifactId>tablestore</artifactId><version>4.12.1</version>
</dependency>

入手指南

初始化

初始化Factory

用户将SyncClient作为参数,初始化StoreFactory,通过工厂创建Meta数据、Timeline数据的管理Store。错误重试的实现依赖SyncClient的重试策略,用户通过设置SyncClient实现重试。如有特殊需求,可自定义策略(只需实现RetryStrategy接口)。

/*** 重试策略设置* Code: configuration.setRetryStrategy(new DefaultRetryStrategy());* */
ClientConfiguration configuration = new ClientConfiguration();SyncClient client = new SyncClient("http://instanceName.cn-shanghai.ots.aliyuncs.com","accessKeyId","accessKeySecret","instanceName", configuration);TimelineStoreFactory factory = new TimelineStoreFactoryImpl(client);

初始化MetaStore

构建meta表的Schema(包含Identifier、MetaIndex等参数),通过Store工厂创建并获取Meta的管理Store;配置参数包含:Meta表名、索引,表名、主键字段、索引名、索引类型等参数。

TimelineIdentifierSchema idSchema = new TimelineIdentifierSchema.Builder().addStringField("timeline_id").build();IndexSchema metaIndex = new IndexSchema();
metaIndex.addFieldSchema( //配置索引字段、类型new FieldSchema("group_name", FieldType.TEXT).setIndex(true).setAnalyzer(FieldSchema.Analyzer.MaxWord)new FieldSchema("create_time", FieldType.Long).setIndex(true)
);TimelineMetaSchema metaSchema = new TimelineMetaSchema("groupMeta", idSchema).withIndex("metaIndex", metaIndex); //设置索引TimelineMetaStore timelineMetaStore = serviceFactory.createMetaStore(metaSchema);

初始化TimelineStore

构建timeline表的Schema配置,包含Identifier、TimelineIndex等参数,通过Store工厂创建并获取Timeline的管理Store;配置参数包含:Timeline表名、索引,表名、主键字段、索引名、索引类型等参数。
消息的批量写入,基于Tablestore的DefaultTableStoreWriter提升并发,用户可以根据自己需求设置线程池数目。

TimelineIdentifierSchema idSchema = new TimelineIdentifierSchema.Builder().addStringField("timeline_id").build();IndexSchema timelineIndex = new IndexSchema();
timelineIndex.setFieldSchemas(Arrays.asList(//配置索引的字段、类型new FieldSchema("text", FieldType.TEXT).setIndex(true).setAnalyzer(FieldSchema.Analyzer.MaxWord),new FieldSchema("receivers", FieldType.KEYWORD).setIndex(true).setIsArray(true)
));TimelineSchema timelineSchema = new TimelineSchema("timeline", idSchema).autoGenerateSeqId() //SequenceId 设置为自增列方式.setCallbackExecuteThreads(5) //设置Writer初始线程数为5.withIndex("metaIndex", timelineIndex); //设置索引TimelineStore timelineStore = serviceFactory.createTimelineStore(timelineSchema);

Meta管理

Meta管理提供了增、删、改、单行读、多条件组合查询等接口。其中多条件组合查询功能基于多元索引,只有设置了IndexSchema的MetaStore才支持组合查询功能。索引类型支持LONG、DOUBLE、BOOLEAN、KEYWORD、GEO_POINT等类型,属性包含Index、Store和Array,其含义与多元索引相同。

TimelineIdentifer是区分Timeline的唯一标识,重复的Identifier会被覆盖。

/*** 接口使用参数* */
TimelineIdentifier identifier = new TimelineIdentifier.Builder().addField("timeline_id", "group").build();
TimelineMeta meta = new TimelineMeta(identifier).setField("filedName", "fieldValue");/*** 创建Meta表(如果设置索引则会创建索引)* */
timelineMetaStore.prepareTables();/*** 插入Meta数据* */
timelineMetaStore.insert(meta);/*** 根据id读取单行Meta数据* */
timelineMetaStore.read(identifier);/*** 更新Meta数据* */
meta.setField("fieldName", "newValue");
timelineMetaStore.update(meta);/*** 根据id删除单行Meta数据* */
timelineMetaStore.delete(identifier);/*** 通过SearchParameter参数检索* */
SearchParameter parameter = new SearchParameter(field("fieldName").equals("fieldValue")
);
timelineMetaStore.search(parameter);/*** 通过SearchQuery参数检索(SearchQuery是SDK原生类型,支持所有多元索引检索条件)* */
TermQuery query = new TermQuery();
query.setFieldName("fieldName");
query.setTerm(ColumnValue.fromString("fieldValue"));SearchQuery searchQuery = new SearchQuery().setQuery(query);
timelineMetaStore.search(searchQuery);/*** 删除Meta表(如果存在索引,同时删除索引)* */
timelineMetaStore.dropAllTables();

Timeline管理

Timeline管理提供了消息模糊查询、多条件组合查询接口。消息的全文检索依托多元索引,用户只需将相应字段索引类型设置为TEXT,即可通过Search接口实现消息的全文检索。Timeline管理包含消息表的创建、检索、删除等。

/*** 接口使用参数* */
SearchParameter searchParameter = new SearchParameter(field("text").equals("fieldValue")
);TermQuery query = new TermQuery();
query.setFieldName("text");
query.setTerm(ColumnValue.fromString("fieldValue"));
SearchQuery searchQuery = new SearchQuery().setQuery(query).setLimit(10);/*** 创建Meta表(如果设置索引则会创建索引)* */
timelineStore.prepareTables();/*** 通过SearchParameter参数检索* */
timelineStore.search(searchParameter);/*** 通过SearchQuery参数检索(SearchQuery是SDK原生类型,支持所有多元索引检索条件)* */timelineStore.search(searchQuery);/*** 将Writer队列中未发的请求主动触发,同步等待直到所有消息完成存储* */
timelineStore.flush();/*** 关闭Writer与Writer中的线程池* */
timelineStore.close();/*** 删除Timeline表(如果存在索引,同时删除索引)* */
timelineStore.dropAllTables();

Queue管理

Queue是单个消息队列的抽象概念,对应一个Store下单个Identifier的所有消息。通过Queue实例管理相应Identifer的消息队列,支持基本的增、删、改、单行查、范围查等接口。

/*** 接口使用参数* */
TimelineIdentifier identifier = new TimelineIdentifier.Builder().addField("timeline_id", "group").build();
long sequenceId = 1557133858994L;
TimelineMessage message = new TimelineMessage().setField("text", "Timeline is fine.");
ScanParameter scanParameter = new ScanParameter().scanBackward(Long.MAX_VALUE, 0);
TimelineCallback callback = new TimelineCallback() {@Overridepublic void onCompleted(TimelineIdentifier i, TimelineMessage m, TimelineEntry t) {// do something when succeed.}@Overridepublic void onFailed(TimelineIdentifier i, TimelineMessage m, Exception e) {// do something when failed.}
};/*** 单个Identifier对应的消息队列* */
timelineQueue = timelineStore.createTimelineQueue(identifier);/*** 存储消息* */
//同步
timelineQueue.store(message);
timelineQueue.store(sequenceId, message);
//异步,支持callback
timelineQueue.storeAsync(message, callback);
timelineQueue.storeAsync(sequenceId, message, callback);
//异步批量
timelineQueue.batchStore(message);
timelineQueue.batchStore(sequenceId, message);
//异步批量,支持callback
timelineQueue.batchStore(message, callback);
timelineQueue.batchStore(sequenceId, message, callback);/*** 单行读取、获取最新一行、获取最新SequenceId* */
timelineQueue.get(sequenceId);
timelineQueue.getLatestTimelineEntry();
timelineQueue.getLatestSequenceId();/*** 根据SequenceId更新消息* */
message.setField("text", "newValue");
timelineQueue.update(sequenceId, message);
timelineQueue.updateAsync(sequenceId, message, callback);/*** 根据SequenceId删除消息* */
timelineQueue.delete(sequenceId);/*** 根据范围参数、Filter获取批量消息* */
timelineQueue.scan(scanParameter);

专家服务

表格存储有一批精通Timeline领域的技术专家,在打造IM、Feed流场景方面有着独到的见解。如果您:

  • 渴望寻觅Timeline领域高手过招;
  • 调研Timeline场景解决方案;
  • 准备入门Timeline场景;
  • 对表格存储(Tablestore)产品感兴趣;


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SLS机器学习最佳实战:日志聚类+异常告警

0.文章系列链接 SLS机器学习介绍&#xff08;01&#xff09;&#xff1a;时序统计建模SLS机器学习介绍&#xff08;02&#xff09;&#xff1a;时序聚类建模SLS机器学习介绍&#xff08;03&#xff09;&#xff1a;时序异常检测建模SLS机器学习介绍&#xff08;04&#xff09;…

大数据成长之路:谈谈那些必须学习的Linux基础知识

作者| Roy瑞士责编| Carol封图| CSDN│下载于视觉中国这里主要介绍学习大数据过程中用到的Linux基础知识&#xff0c;现在主攻的方向是大数据开发&#xff0c;欢迎大家共同交流。环境推荐安装VMware虚拟机并安装CentOS操作系统&#xff0c;具体资源的下载和安装可以查到&#x…

数据可用不可见!揭秘蚂蚁区块链摩斯安全计算平台

“数据安全”与“隐私泄漏”制约数字经济长期发展 在新的商业智能时代&#xff0c;已形成广泛的共识&#xff1a;数据是最基础的生产资料&#xff0c;各个行业与企业对于数据的利用也步入成熟期。可见的未来&#xff0c;数据利用的深度和广度将进一步升级&#xff0c;进入跨机…

如何与亦敌亦友的 null 说拜拜?大神原来是这么做的!

作者| 沉默王二责编| Carol封图| CSDN│下载于视觉中国从 10 年前我开始写第一行 Java 代码至今&#xff0c;一直觉得 null 在 Java 中是一个最特殊的存在&#xff0c;它既是好朋友&#xff0c;可以把不需要的变量置为 null 从而释放内存&#xff0c;提高性能&#xff1b;它又是…

K8s中Pod健康检查源代码分析

了解k8s中的Liveness和Readiness Liveness: 表明是否容器正在运行。如果liveness探测为fail&#xff0c;则kubelet会kill掉容器&#xff0c;并且会触发restart设置的策略。默认不设置的情况下&#xff0c;该状态为success. Readiness: 表明容器是否可以接受服务请求。如果re…

CSE:阿里在线应用如何演进成Serverless架构

Cloud Service Engine&#xff0c;简称CSE&#xff0c;是中间件部门研发的面向通用Serverless计算的中间件产品&#xff0c;目标是具备AWS Lambda的各种优势&#xff0c;同时可以解决AWS Lambda的关键技术缺陷。 AWS Lambda如果用于核心业务&#xff0c;可能会有以下缺陷&…

郫都区计算机学校,成都郫县好升学的计算机学校有哪些

【郫县好一、成都郫县希望1.成都郫县希望职业学校/招生代码&#xff1a;512632.成都郫县希望职业学校/学校简介&#xff1a;成都郫县希望职业学校学校是由郫都区教育局批准成立的&#xff0c;由希望集团投资创办的一所全日制、专业化的民办中等职业学校, 由郫都区教育局主管。学…

技术大佬:今年还学Python,傻了吧? 网友:就你敢说!

随着AI的兴起&#xff0c;Python彻底火了。据Stack Overflow调研报告&#xff1a;Python的月活用户已超越了Java、成为第一&#xff0c;全民Python已为“大势所趋”。那么&#xff0c;程序员有必要追捧Python吗&#xff1f;Python的真香是真香吗&#xff1f;技术大佬&#xff1…

基于Tablestore的Wifi设备监管系统架构实现

Wifi设备监管 某知名跨国公司&#xff0c;在全球范围内拥有大量园区&#xff0c;园区内会有不同部门的同事在一起办公。每个园区内都要配备大量的Wifi设备从而为园区同事提供方便的上网服务。因此&#xff0c;集团需要一套完善的监管系统维护所有的Wifi设备。 公司通过监管系…

聊聊安卓折叠屏给交互设计和开发带来的变化

很多年前&#xff0c;前端同学都觉得PC端的适配&#xff08;兼容处理&#xff09;难&#xff0c;都认为移动端的时代适配会容易得多&#xff0c;也无需考虑那么多的事情。事实并非如此&#xff0c;移动端的时代同样面临着各种适配的处理。特别是刘海机的出现&#xff0c;前端需…

你以为这样写代码很6,但我看不懂

来源 | 沉默王二责编| Carol封图| CSDN│下载于视觉中国为了提高 Java 编程的技艺&#xff0c;作者最近在 GitHub 上学习一些高手编写的代码。下面这一行代码&#xff08;出自大牛之手&#xff09;据说可以征服你的朋友&#xff0c;让他们觉得你写的代码很 6&#xff0c;来欣赏…

在闲鱼,我们如何用Dart做高效后端开发?

背景 像阿里其他技术团队以及业界的做法一样&#xff0c;闲鱼的大多数后端应用都是全部使用java来实现的。java易用、丰富的库、结构容易设计的特性决定了它是进行业务开发的最好语言之一。后端应用中数据的存储、访问、转换、输出虽然都属于后端的范畴&#xff0c;但是其中变…

解决 mysql>com.mysql.jdbc.PacketTooBigException: Packet for query is too large (12073681 > 4194304)

com.mysql.jdbc.PacketTooBigException: Packet for query is too large 异常解决办法&#xff1a; 原因&#xff1a; 查询出的数据包过大&#xff0c;默认情况下mysql 的字段容量不够装&#xff0c;所以抛出此异常 解决办法&#xff1a; 第一步&#xff1a;首先通过SQLyog客…

MySQL数据库无完整备份删库,除了跑路还能怎么办?

来源 | 阿丸笔记责编| Carol封图| CSDN│下载于视觉中国“删库跑路”这个词儿&#xff0c;经常被挂在嘴边当玩笑&#xff0c;是因为大家都知道&#xff0c;一旦真的发生这样的事情&#xff0c;企业损失是无比惨重的。本文作者为 CSDN 博客的一位博主&#xff0c; 从他的描述中得…

区块链和大数据一起能否开启数据完整性的新纪元?

作者 | Vijay Singh Khatri译者 | 天道酬勤 责编 | 徐威龙封图| CSDN 下载于视觉中国每当提到区块链一词时&#xff0c;许多人都会将其与比特币等加密货币联系起来。这项技术通过加快交易速度、提供隐私和透明以及其他更多功能&#xff0c;确实改变了虚拟货币的世界。但是&…

带出7个“师弟”,支付宝BASIC College的辅导员是个伪90后

“我的花名是改之&#xff0c;不是‘有则改之无则加勉’的改之&#xff0c;而是‘杨过&#xff0c;字改之’的那个改之。”一见面&#xff0c;他对自己花名的介绍&#xff0c;就让人耳目一新。至于为什么要用杨过的字给自己起名&#xff0c;他也毫不扭捏地坦诚相告&#xff1a;…

整理了Kafka的一些常用工具,建议收藏备用!| 博文精选

作者 | 犀牛饲养员责编 | 徐威龙封面付费下载于视觉中国本文主要列举一些 Kafka 的常用工具&#xff0c;以及举了一些例子来帮助理解。有需要的小伙伴&#xff0c;可以 Mark 起来再看。环境以下的操作都是基于kafka_2.11-2.2.0工具新建topicbin/kafka-topics.sh --create --zoo…

阿里的初感知

很荣幸能加入阿里这个大家庭&#xff0c;在这短短的一个月里&#xff0c;阿里的一些不同让我印象深刻。 owner精神 入职第一天&#xff0c;上午进行了合同签订和简单的入职培训&#xff0c;下午就领了电脑设备到了办公区。 在电梯里&#xff0c;恰巧遇到了面试过我的同学&…

两大图灵奖得主点赞中国用AI检测新冠,AI还能做什么?

作者 | CV君来源 | 我爱计算机视觉封图| CSDN│下载于视觉中国在这次新冠肺炎疫情肆虐的时候&#xff0c;AI 成为对抗疫情的亮点&#xff0c;前几天两大图灵奖得主 Yoshua Bengio 和 Yann LeCun 在对比中美两国面对疫情处理时&#xff0c;特别点赞了我国企业使用深度学习检测新…

首次披露!阿里线下智能方案进化史

阿里妹导读&#xff1a;AI 技术已经从互联网走向零售、汽车、银行等传统行业。受限于延时、成本、安全等多方面的限制&#xff0c;单一的云解决方案往往不能满足场景需求。线下智能方案逐步成为了智能化过程中重要的一环&#xff0c;今天&#xff0c;我们就一起来了解这一环&am…