2024年1月4日 随笔档案 -凯发k8网页登录

我的最新工程mobileimsdk:http://git.oschina.net/jackjiang/mobileimsdk
posts - 407, comments - 13, trackbacks - 0, articles - 0

2024年1月4日

本文由得物技术暖树分享,有修订和改动。

本文分享的是得物针对现有的消息推送系统的消息送达耗时、实时性、稳定性等方面问题,从零到一构建完整的消息推送质量监控体系和机制的技术实践。

 
 
技术交流:

- 移动端im开发入门文章:《》

- 开源im框架源码:()

(本文已同步发布于:)

2.1 什么是消息推送

消息推送每天都在我们的手机上发生,如下图所示,除非你的手机没有安装app或关闭了通知栏权限。

2.2 消息推送的价值

从用户的生命周期来看,消息推送对于提高app活跃度、提升用户粘性和用户留存率都起到了重要作用。

比如:

  • 1)提升新用户次日留存,低成本促活,对平台的短期留存率影响显著;
  • 2)提升老用户活跃度,push可以通过外部提醒起到拉活的作用;
  • 3)流失用户召回,当用户流失后,若push权限未关闭,通过消息推送的方式,有可能重新唤醒用户。

对于第 2)点,很多内容平台类app的用户push首次启动占比可达 10%以上,因此push对dau的增量贡献不容小觑。

消息中心为得物app提供了强大,高效的用户触达渠道。其中push对于得物dau的贡献有可观的占比,这也就意味着每一条推送消息都是一次与用户沟通的宝贵机会。所以推送的稳定性成为我们关注的首要问题。

那么我们遇到的以下痛点就亟待解决:

1)消息中心没有明确消息推送的耗时标准,业务和技术之间存在gap,业务方对于推送的消息什么时候到达没有明确的心理预期。

2)从技术上来讲消息推送各个节点的耗时不明确,无法对各个节点的耗时做针对性的优化,这也就需要我们针对消息推送的节点耗时进行监控。

3)消息推送的稳定性依赖于第三方的推送通道,而三方通道对于我们来讲就是个黑盒子,如何做到三方通道异常及时发现并止损也是需要考虑的问题。

4)在我们正常的迭代过程中有时候不可避免的会出现些异常或者有坏味道的代码,这些问题能不能及时发现、及时止损,能不能及时告警出来。

sla(service-level agreement),也就是服务等级协议,指的是系统服务提供者(provider)对客户(customer)的一个服务承诺。这是衡量一个大型分布式系统是否“健康”的常见方法。

在开发设计系统服务的时候,无论面对的客户是公司外部的个人、商业用户,还是公司内的不同业务部门,我们都应该对自己所设计的系统服务有一个定义好的sla。因为sla是一种服务承诺,所以指标可以多种多样。

最常见的四个sla指标:

  • 1)可用性;
  • 2)准确性;
  • 3)系统容量;
  • 4)延迟。

 

对于消息推送而言,我们主要关注的是消息能否及时可靠的送达给用户,也就是sla中关注的时效性和稳定性的问题。

目前消息中心针对实效性和稳定性的开发已经完成并初显成效。

系统架构图:

下面主要针对时效性和稳定性的监控做一些介绍。

5.1 节点的拆分

如何做到时效性的无死角监控,那么我们就要对消息推送的整个流程进行拆分,把整个流程拆分成若干个独立且无依赖的可监控节点。

从消息系统流转图中可以看到:整个推送流程是清晰明了的,消息的的推送主要会经历推送鉴权、用户查询、防疲劳过滤、防重复过滤等的逻辑处理,考虑到每个业务逻辑的处理是相互独立且无依赖的,那我们就可以根据具体的业务处理逻辑进行节点的拆分,这样就可以做到拆分无遗漏,监控无死角。

拆分后的具体节点如下:

5.2 节点耗时的计算

具体的节点拆分逻辑和耗时逻辑的计算如下图:

 

节点耗时的计算:记录节点消息推送到达的时间,并计算节点推送耗时,例如:防疲劳耗时 = t7(antifatigueconsumetime) - t6(checkrepeatconsumetime)。

节点阻塞量的计算:记录节点消息推送的瞬时阻塞量, 例如:防疲劳节点阻塞量 = 防疲劳的总量 - 防疲劳已经处理的量。

5.3 节点指标的制定

既然需要监控的节点已经拆分明确了,那针对这些节点我们监控哪些指标才是有意义的呢。

1)目前消息推送高峰耗时较长,各业务域对于消息的到达时间也没有明确的心理一个预期,另外消息中心也无法感知推送在整个链路各个节点的耗时情况,无法针对节点耗时做到有针对性的优化,所以节点的推送量和推送耗时就是我们需要重点关注的指标。

2)节点的阻塞量可以让我们及时感知到推送中存在的积压问题,在大促期间,消息的推送量也会达到一个高峰,消息目前是否有堆积,处理的速度是否跟的上,是否需要临时扩容,那么节点的阻塞量就成了一个比较有意义的参考指标。

考虑到消息推送是有优先级的并且区分单推和批量推,所以我们要针对不同的优先级和推送方式设置不同的标准。

消息推送耗时的具体标准如下:

5.4 技术方案的实现

为了能感知到消息推送中发生的异常和耗时情况,这就需要我们标准化监控指标和监控的节点。

其中耗时指标可以感知节点的耗时和代码的坏味道,阻塞量可以监控到节点的堆积情况,推送成功率可以感知节点的推送异常等。

另外节点拆分后我们可以很快定位到异常发生的具体位置,经过拆分监控的主要节点包括鉴权、风控、用户查询、防疲劳、防重复、厂商调用等。

另外消息中心每天推送大量消息给得物用户,sla监控任何一个操作嵌入主流程中都可能导致消息推送的延迟。这也就要求监控和主流程进行隔离,主流程的归主流程,sla 的归 sla,sla 监控代码从主流程逻辑中剥离出来,彻底避免sla代码对主流程代码的污染,这也就要求sla逻辑计算需要独立于推送业务的主流程进行异步计算,防止sla监控拖垮整个主流程,那么spring aop spring event就是最好的实现方式 。

5.5 成果

消息推送实效性监控做完之后,对服务节点耗时异常可以及时感知,同时也完成了关键节点耗时的指标化。

可以明确的看到所有节点在各个时间的耗时情况,同时也对消息推送针对各个节点的的优化起到了指导作用。

时效性节点监控:

时效性节点告警:

6.1 监控指标制定

消息推送接入的有多个推送通道,如何做到对这些通道做到无死角的监控,及时感知呢。

1)在做厂商监控之前,我们就已经遇到了厂商通道推送跌零的情况,这种情况下整个推送通道都挂掉了,我们要及时通知厂商进行修复,所以厂商推送跌零告警和厂商余量监控是必须的。

2)从现有数据来看,厂商的推送成功率、回执成功率、点击率都稳定在一定的的区间。如果厂商推送的指标数据偏离这个区间则说明推送有异常,所以推送成功率、回执成功率、点击率的监控是必须的。

3)另外从业务请求发送的用户数来看,每天的消息推送基本是稳定的,相对应的厂商的回执数量和点击数量也是稳定的,那么对厂商推送成功的数量,回执的数量和点击的数量监控也有一定的参考意义。

业务侧请求发送的用户数:

厂商监控告警:

6.2 技术方案实现

厂商每天有数亿的消息推送,这也就意味着厂商的监控不能嵌在主流程中处理。厂商的监控代码要从主流程逻辑中剥离出来,避免监控拖垮主流程,同样避免监控异常影响到推送的主流程。

针对厂商推送的监控,目前使用的是有界内存队列实现:

6.3 成果

消息推送厂商监控上线之后,可以及时感知到厂商推送的异常信息,对于厂商推送的异常和厂商规则的更改等可以做到及时的感知。

 

7.1 异常的及时发现

监控上线后及时发现了发现了厂商推送线程关闭失败,厂商推送跌零、厂商营销消息规则更改、厂商通道偶发不可用等问题,并做到了及时的止损。

1)在时效性监控上线之后,发现了因厂商推送线程创建关闭失败导致线程数逐渐上升问题,避免了线上故障的发生。

2)厂商异常导致推送跌零,监控发现后及时通知到厂商并止损。

3)发现厂商营销消息规则更改的异常,并及时经梳理各大厂商文档后发现除了多个厂商通道在未来一个月内也会有规则的更改,消息平台及时适应了厂商规则,接入厂商系统通道,做到了及时止损。

7.2 服务性能的提升

时效性监控上线后发现了多个服务可以优化的点,其中多个厂商和推送节点在高峰推送时耗时较高,很明显节点耗时和厂商推送 sdk 连接池和连接时间参数需要优化。优化后消息推送整体的吞吐量实现了翻倍的提升。

由于时间问题,目前消息监控只做了时效性和厂商推送稳定性相关的监控,但是监控上线后带来的收益还是比较可观的,可以预见的是监控的构建在未来必将带给我们更大的收益,后续我们可以从以下点丰富现有监控。

1)考虑到业务预的推送量和推送时间是稳定的,那么我们可以针对业务维度添加推送数据的监控,及时感知上游推送数据的变化。

2)其次我们可以针对各个节点的推送异常、漏斗转化率、服务性能等做监控,进一步丰富消息平台的监控体系。

3)对于消息推送来讲也要考虑推送的转化率问题,那么卸载、屏蔽等指标也是我们需要监控的点,通过这些业务指标及时感知推送的效果,做到精细化的管控。

消息平台监控上线后带来的收益还是比较可观的,包括多次异常的及时发现和止损,还有发现多个个可以优化的性能点,实现了服务高峰吞吐量的翻倍。

同时也解决了我们现在遇到的以下痛点:

1)时效性明确的给到了不同优先级的耗时标准,避免了业务和技术之间的gap,业务方对于推送的耗时也有了明确的心理预期。

2)时效性使得节点耗时的性能问题可以一目了然,通过对现有节点耗时问题的优化,消息服务的吞吐量实现了翻倍的提升。

3)厂商稳定性监控使得厂商异常可以及时感知,其中厂商稳定性监控上线后发现多起厂商推送的异常,并做到了及时的解决和止损。

4)sla时效性和厂商稳定性上线后,消息中心可以及时感觉到推送链路的异常和代码的坏味道,特别是对于新上线的代码,如果存在异常可以及时感知。

[1] 

[2] 

[3] 

[4] 

[5] 

[6] 

[7] 

[8] 

[9] 

[10] 

[11] 

[12] 

[13] 

[14] 

《》

《》

《》

(本文已同步发布于:)

posted @ 2024-01-25 11:27 jack jiang 阅读(26) | 评论 (0)编辑 收藏

mobileimsdk 是一套专门为移动端开发的开源im即时通讯框架,超轻量级、高度提炼,一套api优雅支持udp 、tcp 、websocket 三种协议,支持ios、android、h5、小程序、uniapp、标准java平台,服务端基于netty编写。

工程开源地址是:

  • 1)gitee码云地址:
  • 2)github托管地址:

► 详细产品介绍:
► 版本更新记录:
► 全部运行截图:
► 在线体验下载:、      (关于 ios 端,请:

 

rainbowchat是一套基于开源im聊天框架  的产品级移动端im系统。rainbowchat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题(可自行下载体验:)。

* rainbowchat可能是市面上提供im即时通讯聊天源码的,唯一一款同时支持tcp、udp两种通信协议的im产品(通信层基于开源im聊天框架   实现)。

此版更新内容():

(1)android端主要更新内容新增“@”功能、消息引用功能等】:

  • 1)[新增] 新增“@”功能;
  • 2)[新增] 新增消息引用功能(支持引用全部消息类型);
  • 3)[bug] 解决了转发的是收到的短视频消息时,发送者这边不从网络加载预览图的问题;
  • 4)[bug] 解决了离线好友消息在凯发k8网页登录首页“消息”列表上显示的时间不是最后一条消息的发送时间问题;
  • 5)[优化] 凯发k8网页登录首页消息列表中的语音消息将显示语音时长(跟新版微信一样);
  • 6)[优化] 其它优化及bug修复。

(2)服务端主要更新内容:

  • 1)[新增] 增加了“@”功能相关数据字段和代码逻辑的实现;
  • 2)[新增] 增加了消息引用功能相关数据字段和代码逻辑的实现;
  • 3)[优化] 更新了消息推送特权接口,支持陌生人、好友、群聊3种消息的推送,且增加了主机ip检查(提高安全性);

此版新增功能运行截图():

posted @ 2024-01-24 12:44 jack jiang 阅读(24) | 评论 (0)编辑 收藏

本文由百度搜索技术平台研发部分享,本文有修订和改动。

分布式数据传输系统是一种用于在多个计算节点之间高效传输大量数据的系统,诣在高效的解决大规模数据迁移、备份、跨地域复制等问题。其广泛应用在实时数据流传输、跨数据中心数据迁移、多媒体传输等场景,在大多数企业中的日志管理、业务数据建库等场景中也都会使用到。

众所周知,数据的高效传输往往直接影响着企业对市场先机的把握,对企业发展有重要意义,特别是在金融领域,如证券行业,它对分布式数据传输系统的设计提出了更高的要求,证券领域数据变化飞快,一个高时效、稳定的数据流传输系统不仅能有效的提升用户体验,更能提供用户一手的投资信息,有助于用户的投资决策,进而拉进企业与用户的距离。

本文将通过一个百度搜索旗下的金融场景案例来分享构建高实时、高可用的分布式数据传输系统的技术实践。

 
 
技术交流:

- 移动端im开发入门文章:《》

- 开源im框架源码:()

(本文已同步发布于:)

作为百度搜索场景下时效性要求较高的业务,金融承载着每天数千万次的用户搜索请求。

而在2021年以前,金融业务的数据一直都是采用传统的互联网引入方式,该方式的特点是接入成本较低,但受公网等不可控因素影响,数据时效性较差,且数据断流、错误等问题频出,随即而来的就是业务维护成本较高,十分不利于产品迭代。

我们基于此发起了一个证券数据直连项目,诣在通过接驳全球各大证券交易所数据中心来构建一个高时效、高可用的分布式传输系统,从而有效的解决传统数据引入方式(公网抓取、推送)所带来的时效性、稳定性、正确性等问题,进而满足全国乃至全球用户的金融需求。

3.1业务目标

接驳全球各大证券交易所level-1行情数据,来覆盖全量上市公司股票、外汇、期货、etf、涡轮牛熊等证券业务来满足用户需求,时效性追平金融行业竞品,为打造强大的金融生态做数据基建储备。

level-1行情简称lv1行情:是交易所根据交易规则发布的即时行情信息,数据格式包括基于fix/fast协议的接口和txt文件、二进制数据流等,行情通过交易所信息技术公司的高速地面网和宽带广播卫星系统发布或上证所信息网络有限公司的互联网和专线传输。

3.2技术目标

1)基础设施建设:协同交易所、运营商完成物理专线的链路部署,通过物理专线接入的方式在百度云机房接入上海、深圳、香港、纳斯达克证券交易所数据中心,适配交易所单、组播协议将二进制流/文本数据引入到百度内部,再分别完成华南、华北、华东、香港(支持海外访问)地域的数据存储与转发,同时支持负载和流量调度来支撑各地域的用户请求。(注:这里的物理专线特指光缆)

2)时效性和稳定性提升:行情数据检索99分位耗时不超过200ms,数据稳定性从99%提升至99.99%以上,数据灾备能力从1主0备升级至1主2备。

3)数据安全:基于百度安全能力,构建类似的防火墙策略来严格控制每一个机房、每一个集群的出入权限,并且配置好相应的安全组策略。

从功能和网络拓扑上来看,一个高时效、高可用的金融数据传输系统至少需要包含以下几个部分,我们逐个来进行解读。

4.1接入层

适配全球各大交易所单、组播传输协议,确保数据能在专线物理网络正常传输。

接入主要有2种方式:

  • 1)一种是走互联网;
  • 2)一种是走物理专线。

前者相对比较灵活:各类数据协议基本都可以支持,有直接走http(get/post),或者是走消息队列的发布订阅等等,接入成本较低,属立即接入那种,但受公网的不可控因素影响,在传输效率和安全性上相对后者会有比较大的差距,我们一般会把互联网的方式当做一个灾备能力存在。

专线方式的特点:是仅点对点传输,由于用的是独立的光缆,在有限带宽内理论可以做到无争用状态,不受公网影响,属可靠传输,传输协议私有化,增加了更多的认证机制。因此也更安全,区分不同应用场景,像证券类数据传输,一般交易所采用的是单播、组播方式,当下用的多的是组播。另外专线中也有主备的概念,一般会预留1-2条线路做灾备,整体下来,专线的费用要更昂贵一些,接入的周期也更长,往往长达几个月。

4.2网络层

完成华南、华北、华东百度云机房虚拟网络架构建设,包括子网、路由、网关等。

虚拟网络的核心组成部分主要是子网、路由、网关、虚拟机,其中每个子网关联着一个虚拟机集群,我们把整个组成部分(域)统称为一个vpc(virtual private cloud),路由又区分为tgw路由和对等连接。

这里主要关注对等连接,它是为用户提供了vpc级别的网络互联服务,使用户实现在不同虚拟网络之间的流量互通,实现同区域/跨区域,同用户/不同用户之间稳定高速的虚拟网络互联,其核心是基于对路由表的操作,对等连接也支持配置地域级的dns同步。

网关又分为nat网关和专线网关:

1)一个对外:比如设置snat和dnat规则用于统一网段的外网出口;

2)一个对内:对内其实就是确保能够走专线和内部网络打通。

4.3传输层

完成各机房内的数据解析、存储、同步、转发等。

对于接入层获取到的数据我们分为三个级别:

1)像交易所主要是二进制流、文本为一级数据,我们需要保留近一段时间的原始数据落在本地(一级数据管理集群),以便用作应急回放。

2)而解码后的数据为二级数据,落在二级数据管理集群上,主要用于跨地域同步。

3)最后,对解码后的数据进行计算&加工,作为三级数据,落在三级数据管理集群用于承接应用服务。同时,按协议解码后的数据按照使用场景区分为实时流(如分时)、延时流(如k线),延时流经过实时流计算得来,实时流同步进内存用于提升io效率,延迟流通过实时流的计算后异步进db,db维护在三级数据管理集群上。

4.4应用层

负载/流量调度、监控能力等建设。

应用层的设计,主要有两个方面的考虑:

1)一方面是对于接入层的负载和流量调度,如通过部署websocket/http服务来支撑百度用户流量,使用blb(baidu load balance)将同一区域的多台百度智能云服务器虚拟成一个组,设置一个内网或外网的服务地址,将前端并发访问转发给后台多台云服务器(bcc),实现应用程序的流量均衡,性能上实现业务水平扩展。

负载均衡还通过故障自动切换及时地消除服务的单点故障,提升服务的可用性,支持服务器调度权重策略配置,并支持tcp、http等协议。

2)一方面是对监控的应用,如请求/数据传输日志落盘、统计、分析以及流量和sla监控等。

4.5小结

将以上四层能力建设后,此时单机房内的网络拓扑应该如下图所示。

注:dcc/bbc/bcc都是百度云范畴的机器类型,更多细节可以参考百度智能云私有网络:。

公网和私有网络方式下如何在云上完成多协议适配,尤其是在私有网络中适配单播、组播协议以及如何做组播转单播。

5.1公网&私有网络接入介绍

对于一个数据传输系统来说,最重要的一点其实就是能支持多协议的数据适配来提升系统的灵活性,证券交易所一般提供的接入方式有公网接入和私有网络接入,公网接入的成本较低,一般周粒度就可完成,没有复杂协议约束。

而私有网络往往会有更高的要求,协议上大部分都要求具备单播介入能力,少部分像纳斯达克和深圳交易所会要求下游支持组播接入。绝大多数的云厂商是无法直接在虚拟机上适配的,传统券商基本都是完全使用昂贵的物理机资源来承载,虽然物理机插拔更方便也更稳定,但运维管理成本也更高。

两种方式在效果和成本上也有本质的区别:

1)公网接入:公网比较常见的数据接入方式主要是http/https方式,当然也会有rpc/ftp,只是用的相对少一些。

为了提升数据传输安全,双方可以在调用前协商好数据加密算法和密钥。优点是接入成本较低,能快速应用,尤其在跨洋传输上会有体现。缺点是走的公共线路,网络不可靠,且数据易被截获,当攻击者捕获两端的数据包后,哪怕不能完全解析,也可以实施一些流量攻击手段以影响服务稳定性。总的来说,一般不会对于安全性、时效性要求较高的数据采用该方式接入,更多是只是一种备用方式(特殊场景除外,如跨洋传输)。

2)私有网络接入:公司内网其实就属于一个私有网络,但是对于跨公司传输数据的场景,要想构建私有网络,一般会走物理专线接入的方式。

这种点对点传输方式的显著优点是专网专用且安全性较高,基本不受公共网络影响(自然灾害等不可抗力除外),在带宽范围内基本可以做到无网络争用状态(数据即发即达),由于是私有网络(双端内网传输),基本不用担心数据安全问题,而且往往还会增加额外的数据校验手段,尤其在金融场景,会有严格的token(硬/软)认证,该方式的缺点是成本相比公网传输接入成本更高,一般要持续数月,费用更昂贵,一般在上百万元,依赖选取的传输介质(一般选择光纤)和带宽。

5.2私有网络中单播、组播协议接入方案

私有网络有单播、广播、组播之分。

1)单播:相对比较好适配一些,走静态路由的方式在同一个vlanid下分别配置云端和idc端的ip段作为ipv4专线互联地址即可。

2)广播:一般是对于服务端而言,比如证券交易所下游对接着全球范围的所有券商,数据源是相同的,一般会采用广播的机制把数据推送给所有下游。

3)组播:一般是要求下游需要适配,现如今大部分业务都已经上公有云,在云上常用虚拟化技术来完成服务器集群的部署。

对于虚拟机来说,更多的支持单播传输,不支持组播传输,往往需要在专门的物理设备(组播路由器、或特定的组播软件)上配置转发组播报文的路由,路由表关联着具体的路由协议(如pim),再用igmpv3协议来完成组播成员和报文的管理,通过动态bgp维护邻居关系(现在的云厂商上对bgp的可能是固定分配as号,如果有as的要求还是需要在物理机上单独做),我们可以圈出一部分物理资源专门承载组播数据传输,通过配置igmp snooping(可以将组播报文转发到二层数据链路层,实现组转单,注意版本需要是3,否则无法转发igmpv3报文) ap完成组播转单播配置,再通过双网卡(wan口 lan口)形式实现专线网络数据接入&同步到百度内网,物理机通过三层交换机来关联,构造出类似下面的网络拓扑(如下图所示)。

6.1概述

数据管理&跨地域同步,数据灾备能力、时效性提升。

数据的分层管理主要是应对单机房内的场景,而对于跨机房或者说跨地域的主要难点是数据同步,后者需要更多的考虑跨机房数据传输效率和灾备管理,核心是网络设计。

6.2数据管理

按使用场景的不同,将数据分交易所二进制流数据(原始数据流)、文本数据、业务数据/日志等。

1)原始数据流:主要应对单机房、跨机房传输场景,当出现下游业务服务异常导致的数据展现错误时,存储的原始数据流可以很好的对数据进行回放,以便快速恢复业务,尤其是应对金融证券数据传输场景,证券交易所一般不会推送重复数据,如果下游业务服务异常导致存储的业务数据全部失效或为脏数据,那可能只能通过refresh主动请求上游来重新获取。

但这样做可能会出现核心数据丢失,由于这种方式的效率较低,还会扩大业务受损的影响面,因此一般会先存储交易所下发的原始数据流,业务可以自定义存储方式和周期,当出现问题时,可以通过『重播』原始数据流来止损。

另外原始数据流还能用于在对等网络中的跨机房恢复业务数据。

2)业务数据流:主要应对单机房传输的场景,根据模块分工的不同,分证券的实时行情、历史行情等等,对于单机房数据集群的管理我们有很多方式,对于自研的db,在调度上可以用一些标准的分布式管理手段(如zk),数据同步的手段一般需要自定义,对于传统的db如mysql、redis、mongo等,一般有标准化的数据同步方式和调度模式。

6.3跨地域同步

跨机房地域同步的前提是多个机房之间需要有直接或间接关联关系的专用物理网络,即确保网络是可达的,然后再结合虚拟网络完成子网及路由配置。

对于具有直接网络关联关系的2个机房来说,我们的对等网络(peer connection)设计稍微简单一些。

现在各个云厂商也基本都支持直接配置了,其原理是首先在同一个vpc下划分好子网并规划好集群规模,其次通过配置路由表的方式完成本端和对端的下一跳关联,这样就完成了2个直接对端的对等网络建设。

接着再配置和内网专线的路由,就能做到云机房->内网机房的网络互通。

但如果2个机房没有直接关联关系,而又需要完成本端和对端数据同步怎么办呢,比如有a b c三个机房,只有a-b b-c有直接关联关系,而我们想要让a-c关联,这时候不可能说再建立一条物理链路,我们可以采用类似桥接的方式(或者叫隧道),同时关联a-b-c三个机房,其中b作为一个"网桥",再通过nat技术完成ip地址转换,确保c可以识别从a过来的路由,而a-b b-c 正常采用对等网络的方式完成基础网络配置,这样就可以胯多个机房进行通信,由于是物理网络传输,机房间的耗时不会有很大差别(30ms内)。

由于网络细节的篇幅较多,我们不做详细的赘述,这里我们看看跨地域同步的网络架构(如下图所示)。

 

注:图中网段可以根据不同场景做划分,这里只做简单介绍。

6.4数据灾备能力、时效性提升

数据灾备:我们一般选择离各个证券交易所就近的一个接入点,比如上证选择在上海机房接入,深证选择在广州接入,纳斯达克在香港接入,每个接入点配置2条专线用做物理链路的主备,同时扩展一条互联网通路(注意这里的互联网也是直接和交易所对接,已经不是传统数据引入渠道)做次备,链路默认都是活跃状态,有专们的物理设备会根据专线的健康状况(自定义逻辑)自动切换。

最后,再根据上面提到的跨地域同步的原理,在云机房关联各条物理链路,在每条物理链路上抽象出独立的vpc,通过构建网络拓扑实现跨机房数据复制及灾备。

时效性:物理专线(光缆)接入方式天然的优势就是数据"即发即达",因为在固定带宽内基本不存在网络争用,而且现在大部分线路都会配置中继,其损耗带来的影响相对可控,因此接入方式就决定了数据传输的时效性。

相比传统互联网接入方式,单从数据上来看,专线接入sla超过5个9(互联网接入2个9),当然也会配置上重传机制来进一步提升数据到达的可靠性。

交易所下发数据的数据频率按市场划分,a股一般3s/笔,港美股没有特殊限制,即有成交即下发,除去光损耗带来的影响,最快可以到3ms/笔,由于频率越高,对机器要求也越高,为此我们特殊做了一些限频操作,整体的数据时效性基本会在60ms(99.99 分位)内。

7.1概述

集群管理&单地域、跨地域流量调度。

流量调度生效在应用层,主要是找到一种高效的调度/负载方式来对内/外的业务提供数据支撑,从协议上/应用场景划分主要有tcp/http,策略上因业务而异,主要还是基于对流量分配中权重的定义。

比如有基于rs健康检查的分配,每隔一段时间探测一下下游集群的健康状况来动态调整流量配比,也可以根据下游机器的连接数来分配,还可以基于对资源访问的热度来分配,区分单地域和跨地域场景如下面所述。

7.2单地域场景

现在各个云厂商都有相应的流量调度产品支撑,比如百度云上有blb(baidu load balance),可以很轻松构建一个调度规则出来,在blb下可以设置调度集群的协议(tcp/http),然后关联对应的服务器集群,最后给不同的服务器集群配置权重策略。

当流量进来时,blb会帮我们完成自动分配,在某一个集群出现问题时,可以手动调整集群权重来干预流量配比,即所谓的切流。

7.3多地域场景

多个机房间的流量调度策略是在云上一般是隔离开的,当然我们可以在多个机房的最上层再抽象出一个专门的调度集群,对外暴露一个vip。

在这个vip上配置多个地域之间的调度关系,互联网公司基本上也都是这么做的,更多的是针对超大集群规模的场景,而且vip的选取也是有条件/成本的。

但如果想低成本快速在云上创建一个能支持多地域同时访问且具备自动化流量调度的应用,且云上又不支持多地域共享vip的功能时,我们可以尽可能多的基于云上已有的功能自己完成,在每个机房内部单独抽出一个类似nginx的集群,每个集群上维护着不同于本地域的调度关系,它们的下游就是不同于本机房的blb,同时互相检查对方的健康状况并上报监控系统,这样当出现异常时,除了能针对性的在本机房内完成blb级的流量调度,还能做到多机房间的流量切换,以提升机房间的灾备能力。当然,也需要有足够的容量。

 

上图各个模块的作用如下(各模块均采用多路复用):

1)源数据接入集群:适配2种方式(互联网/物理专线) 各类协议(互联网、单播、组播)的数据源接入;

2)源数据转发集群:确保各机房源数据的一致性,降低由于业务服务本身带来的数据不一致问题;

3)数据解析集群:公共模块,主要是针对源数据进行统一的处理,以便转发给下游各业务;

4)业务数据集群(实时/延时流):负责将数据解析集群下发的内容转换成业务详细数据,也就是b端或c端用户看到的数据;

5)网关集群:负责承载用户访问流量;

6)监控集群:负责收集各个集群上报的日志情况,并作为稳定性管理手段之一。

可以看到:机房b相比其他机房,少了接入层配置,这主是基于成本和性能上考虑,把机房b当做数据传输枢纽,不仅能保证本机房数据传输,也能支持跨机房的数据同步&复制。该分布式传输系统从数据接入到监控集群,整体机器规模不大(100左右),但可支撑超过10亿的流量。

一个良好的产品体验及产品矩阵,其背后一定离不开一个高可用、高时效的数据支撑,尤其是在金融领域,用户只可能会为一手的信息、完善的产品功能买单。

自21年完成数据通路建设以来,金融的稳定性和业务规模都有了质的飞跃,证券数据时效性问题从季度数十个降低到年度1个以内,99分位耗时更是从过去的分钟级降低到60ms以内,数据sla从2个9左右提升至5个9以上,产品覆盖股票、外汇、基金、期货等诸多领域,也是第一个在搜索领域支持行情长连接的业务,基于搜索生态也孵化出来了像百度股市通pc站、app等多个独立端产品,目前正在结合ai能力进行持续优化,期望从完善用户体验->帮助用户决策进阶,也让金融投资变得更智能,更简单。

本文主要结合一个金融数据接入案例对分布式数据传输系统做了一个简单的介绍,包括传输系统中的一些核心节点的设计,如数据接入层的多协议适配、数据的分层管理以及跨地域的数据同步对应的网络拓扑等,通过实验得出结论,该方案能很好的应用在各种规模的分布式数据传输系统设计中。当然,由于篇幅问题,也省略了很多实现上的细节,读者有任何问题可以留言,可以一起探讨,也会尽量答复。

[1] 

[2] 

[3] 

[4] 

[5] 

[6] 

[7] 

[8] 

[9] 

[10] 

《》

《》

《》

《》

《》

《》

《》

《》

《》

《》

《》

《》


(本文已同步发布于:)

posted @ 2024-01-18 11:22 jack jiang 阅读(33) | 评论 (0)编辑 收藏

为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第32 期。

[- 1 -] 

[链接] 

[摘要] 本文作者将以自已im开发过程中的真实总结,分享针对大量离线聊天消息,在确保用户端体验不降级的前提下,保证离线消息的可靠投递。


[- 2 -] 

[链接] 

[摘要] 本文主要以android客户端为例,记录了有赞旗下 app 中使用自研 im,并将im提炼成组件化sdk的设计思路。


[- 3 -] 

[链接] 

[摘要] 本文主要聚焦这套亿级用户的im架构的一些比较细节但很重要的热门问题上,比如:消息可靠性、消息有序性、数据安全性、移动端弱网问题等。


[- 4 -]

[链接] 

[摘要] 本文将以轻松活泼的语言形式,为你分析和讲解微信手机扫码登录的技术原理,希望在你的im中开发此功能时有所启发。


[- 5 -] 

[链接] 

[摘要] 本文将简要的介绍扫码登录功能的技术实现逻辑,并实际结合淘宝、微信的扫码登录功能,学习和研究大厂主流应用的技术实现思路。


[- 6 -] 

[链接] 

[摘要] 最近刚好看到一个二维码的技术原理讲解视频,正好借此机会将扫码登录的详细技术原理梳理并总结一下,方便自已回顾,也希望能帮助到想在im里开发类似功能的同行们。


[- 7 -] 

[链接] 

[摘要] 二维码技术使用起来很简单,本系列的前三篇文章也专门针对im扫码登录这个功能做了详细的分享,但本着学习技术不留死角的习惯,我认为有必要单独学习一下到底什么是二维码。


[- 8 -] 

[链接] 

[摘要] 本文内容仅供参考,具体的凯发天生赢家一触即发官网的解决方案请务结合自已的系统构架和实现情况,多阅读几篇即时通讯网上有关这个技术话题的文章,取其精华,找到适合自已的技术方案和思路才是最明智的。


[- 9 -]  

[链接] 

[摘要] 本文总结了阿里闲鱼技术团队使用flutter在对闲鱼im进行移动端跨端改造过程中的技术实践等,文中对比了传统native与现在大热的flutter跨端方案在一些主要技术实现上的差异,以及针对flutter技术特点的具体技术实现,值得同样准备使用flutter开发im的技术同行们借鉴和参考。


[- 10 -] 

[链接] 

[摘要] 本文根据融云亿级im消息系统的技术实践,总结了分布式im消息的可靠投递机制,希望能为你的im开发和知识学习起到抛砖引玉的作用。


[- 11 -] 

[链接] 

[摘要] 本文将具体来聊聊网易云信是如何实现im客户端全文检索能力的,希望能带给你启发。


[链接] 

[摘要] 本文将要分享是融云im技术团队基于对自有产品“消息”列表卡顿问题的分析和实践(本文以andriod端为例),为你展示一款im在解决类似问题时的分析思路和凯发天生赢家一触即发官网的解决方案,希望能带给你启发。


👉52im社区本周新文:《》,欢迎阅读!👈

我是jack jiang,我为自已带盐!https://github.com/jackjiang2011/mobileimsdk/

posted @ 2024-01-17 12:01 jack jiang 阅读(32) | 评论 (0)编辑 收藏

本文由21cto万能的大雄分享,本文有修订和改动。

在当今快速发展的技术环境中,对跨平台桌面应用程序的需求正在不断激增。

开发人员面临着选择正确框架之挑战,以便可以高效构建可在 windows、macos 和 linux 上无缝运行的应用程序。

在本文中,我们将比较五种流行的桌面应用程序开发框架:、、、  ,希望可以帮助你根据项目需求做出明智的技术选型决策。

 
技术交流:

- 移动端im开发入门文章:《》

- 开源im框架源码:()

(本文已同步发布于:)

本文是系列文章中的第10篇,本系列总目录如下:

《》

《》

《》

《》

《》

《》

《》

《》

《》

《》(* 本文)

1)electron:

* 技术背景: 由 github 开发,因其使用 html、css 和 javascript 等 web 技术构建跨平台桌面应用程序的能力而广受欢迎。

* 主要功能:electron 通过其 node.js 集成提供对本机 api 的轻松访问,使开发人员能够创建功能丰富的应用程序。它还支持用 c 编写的本机插件,尽管构建这些插件可能更复杂且容易出错。

2)flutter:

* 技术背景: 由 google 创建,以其在移动应用程序开发中的使用而闻名,但也可用于桌面应用程序。

* 主要特点:flutter 提供了一组丰富的可定制 ui 小部件,其 dart 代码被编译为本机机器代码,从而实现快速执行并减少开销。它采用独特的“基于小部件”架构,提供丰富的可定制 ui 小部件。

3)tauri:

* 技术背景: 是一个较新的框架,旨在创建安全且轻量级的桌面应用程序。它旨在弥合 rust 和 web 技术之间的差距。

* 主要功能:tauri 支持使用 rust 或 c 构建本机插件,从而可以访问 web 平台中不可用的本机 api 和功能。

4)react native:

* 技术背景:,同样来自 facebook,主要以移动应用程序开发而闻名,但也有桌面应用程序开发的扩展。

* 主要功能:react native 提供了一种访问本机 api 和功能的方法,但与其他框架相比,它可能需要更多的努力。它支持无缝集成第三方库。

5)qt:

* 技术背景: 是一个 c 框架,绑定了多种语言,包括 python 和 javascript。这是一个历史悠久、历史悠久的框架。

* 主要功能:qt 提供出色的本机集成功能,允许开发人员访问本机 api 和功能。它提供了一套用于构建跨平台桌面应用程序的全面工具,并强调本机外观和感觉。

在跨平台功能方面,electron、flutter、tauri 和 qt 足以在多个操作系统上运行应用程序。它们为 windows、macos 和 linux 提供广泛的支持,使其成为需要广泛兼容性的项目的合适选择。

react native 虽然主要是为移动设备设计的,但可以扩展以创建桌面应用程序。然而,它的跨平台支持可能不像其他框架那样无缝,并且可能需要额外的努力才能在所有平台上实现一致的性能和 ui。

性能是桌面应用程序开发的关键因素。

以下是这些框架的性能特征:

  • 1)electron:以其较高的资源使用率而闻名,electron 应用程序可能会占用更多内存和 cpu,从而影响较旧或功能较弱的计算机的性能;
  • 2)flutter:flutter 的性能值得称赞,这要归功于它的编译代码和 gpu 加速。它提供快速的启动时间和流畅的动画;
  • 3)tauri:tauri 因其轻量级特性和低资源消耗而脱颖而出。它是构建快速且响应灵敏的桌面应用程序的绝佳选择;
  • 4)react native:react native 桌面应用程序可以节省资源,但跨平台优化性能可能需要额外的工作;
  • 5)qt:qt 的性能非常出色,提供类似本机的速度和响应能力。它是资源密集型应用程序的首选。

创建丰富且响应迅速的用户界面是桌面应用程序开发的一个重要指标。

以下是这些框架在 ui 功能方面的比较:

  • 1)electron:electron 提供了大量预构建的 ui 组件和广泛的主题选项。开发人员可以轻松创建具有视觉吸引力的应用程序;
  • 2)flutter:flutter 基于小部件的方法允许高度可定制且具有视觉吸引力的用户界面。它提供了广泛的开箱即用的小部件;
  • 3)tauri:tauri 不像其他框架那样提供那么多的 ui 组件,但允许对用户界面进行严格控制,这有利于创建独特的设计;
  • 4)react native:通过react native,开发人员可以使用第三方库和组件进行ui设计。可能需要额外的工作才能实现完全定制的外观;
  • 5)qt:qt 擅长提供与目标平台无缝集成的类似本机的 ui 元素。它是需要精美原生外观的应用程序的首选。

流畅的开发工作流程对于生产力至关重要。

以下是这些框架在开发经验方面的比较:

  • 1)electron:electron 提供了一套广泛的开发工具和一个活跃的社区。调试和热重载得到良好支持;
  • 2)flutter:由于其基于 widget 的架构和强大的文档,flutter 的开发体验得到了简化。热重载是一个突出的功能;
  • 3)tauri:tauri 仍然相对较新,但使用 rust 和 javascript 提供了简化的开发过程。它强调快速发展;
  • 4)react native:react native 为 web 和移动开发人员提供了熟悉的开发体验。然而,过渡到桌面可能需要一个学习曲线;
  • 5)qt:qt 提供了一个成熟的开发环境,具有广泛的 ide 和工具。它以其稳定性和全面的文档而闻名。

访问本机平台功能和 api 对于许多桌面应用程序至关重要。

让我们看看这些框架如何处理本机集成:

  • 1)electron:electron 通过 node.js 集成提供对本机 api 的轻松访问。它还支持用 c 编写的本机插件,尽管构建这些插件可能更复杂且容易出错;
  • 2)flutter:flutter 的 dart 代码被编译为本机机器代码,从而实现快速执行并减少开销。它采用了一种称为“基于小部件”架构的独特方法,提供了一组丰富的可定制 ui 小部件;
  • 3)tauri:tauri 支持使用 rust 或 c 构建原生插件,可用于访问 web 平台中不可用的原生 api 和功能;
  • 4)react native:react native 提供了一种访问本机 api 和功能的方法,但与其他框架相比可能需要更多的努力。它支持无缝集成第三方库;
  • 5)qt:qt 提供出色的本机集成功能。它是一个 c 框架,绑定了多种语言,包括 python 和 javascript,可用于访问本机 api 和功能。

开发人员社区的规模和活跃度,可以显着影响框架的成功和第三方库的可用性。

这些框架的表现如下:

  • 1)electron:electron 拥有一个庞大而活跃的社区,提供大量可用的插件和扩展;
  • 2)flutter:flutter 拥有不断增长的社区和越来越多的软件包,主要专注于移动开发,但也有桌面扩展;
  • 3)tauri:tauri 仍在成长,但其社区充满热情并致力于其发展。其生态系统正在稳步扩展;
  • 4)react native:react native 拥有完善的社区,主要专注于移动开发。桌面扩展社区规模较小,但正在不断增长;
  • 5)qt:qt 拥有悠久的历史和强大的生态系统,拥有庞大的工具、小部件和扩展库。

让我们探索一些现实世界的用例和使用这些框架构建的应用程序示例,以更好地了解它们在不同场景中的优点和缺点。

以下是具体的场景举例:

  • 1)electron:广泛用于构建跨平台桌面应用程序,包括代码编辑器(vscode)、通信工具(slack)和娱乐应用程序(spotify);
  • 2)flutter:flutter 逐渐成为富媒体应用程序的选择,已用于 google ads、阿里巴巴和 reflectly 等应用程序;
  • 3)tauri:tauri 正在获得轻量级、安全应用程序的青睐,包括密码管理器 (losepass) 和通信工具 (mailspring);
  • 4)react native:虽然主要是一个移动框架,但 react native 已扩展到 discord 和 microsoft teams 等应用程序中的桌面使用;
  • 5)qt:qt 是一种多功能选择,可用于从工业软件到游戏和汽车信息娱乐系统的广泛应用。

虽然每个框架都有其优点,但必须意识到潜在的挑战和限制。

比如这些:

  • 1)electron:electron 应用程序可能会占用大量资源,可能会导致旧硬件上出现性能问题;
  • 2)flutter:如果您主要是移动开发人员,那么使用 flutter 进行桌面开发可能会涉及一个学习曲线;
  • 3)tauri:作为一个相对较新的框架,与更成熟的选项相比,tauri 可能拥有较小的社区和较少的第三方库;
  • 4)react native:将 react native 转换到桌面可能需要额外的努力,并且某些特定于平台的功能可能更难访问;
  • 5)qt:qt 的学习曲线,特别是对于刚接触 c 的开发人员来说,可能是一个挑战。

为桌面应用程序开发选择正确的框架很大程度上取决于项目的具体要求,例如目标平台、性能预期、ui 需求和所需的开发体验。

如果正在寻找一个允许你利用 web 技术的框架,electron和react native是不错的选择。electron 拥有庞大的社区和广泛的预构建组件,而 react native 提供强大的组件系统,并允许在移动和桌面平台之间重用代码。

如果性能和小包大小是优先考虑的,请考虑flutter或tauri。flutter 提供快速的启动时间和流畅的动画,而 tauri 则以其轻量级和低资源消耗而闻名。

如果你需要一个具有出色本机集成和本机外观的框架,qt是一个可靠的选择。

如果你正在开发需要丰富的、可定制的用户界面的复杂应用程序,flutter可能是最佳选择,因为它基于 widget 的开发方法。

还请各位开发者要记住,请考虑与每个框架相关的学习曲线,特别是如果你或团队尚不熟悉所涉及的技术。比如,tauri 需要 rust 或 c 的前置知识,而 flutter 使用 dart 做为预备知识。

[1] 

[2] 

[3] 

[4] 

[5] 

[6] 

[7] 

[8] 

[9] 

[10] 

[11] 


(本文已同步发布于:)

posted @ 2024-01-11 10:58 jack jiang 阅读(64) | 评论 (0)编辑 收藏

为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第31 期。

​[- 1 -] 

[链接] 

[摘要] 如何优雅地解决“消息序列号只要保证顺序性而不需要兼顾唯一性”的问题呢?这就是本文所要分享的内容,强烈建议深入理解和阅读。


[- 2 -] 

[链接] 

[摘要] 本篇将会介绍 seqsvr 分布式容灾架构的演变。


[- 3 -] 

[链接] 

[摘要] 本文要分享的是融云即时通讯云产品中的聊天消息id生成算法和策略,一个19字节的id就能包含:时间戳、消息类型、会话id、序列号,小id、大用途,值得借鉴!


[- 4 -]

[链接] 

[摘要] 对于美团的leaf-segment这个id生成方案,因为生成的id全局唯一、全局有序,所以非常适合im这种应用场景,这也是即时通讯网整理并分享给社区的原因。


[- 5 -] 

[链接] 

[摘要] 本文是专题系列文章的第5篇,专门介绍百度开源的分布式消息id生成器uidgenerator的算法逻辑、实现思路、重点源码解读等,或许能带给你更多的启发。


[- -] 

[链接] 

[摘要] 本文将要分享的是滴滴开源的分布式id生成器tinyid的技术原理、使用方法等等,希望能进一步为你打开这方面的技术视野。


[- 7 -] 

[链接] 

[摘要] 本文通过对分布式id的3种应用场景、实现难点以及9种分布式id的实现方式进行介绍,并对结合vivo业务场景特性下自研的鲁班分布式id服务从系统架构、id生成规则与部分实现源码进行分享,希望为本文的阅读者在分布式id的方案选型或技术自研提供参考。


[- 8 -] 

[链接] 

[摘要] 本文将根据微信官方目前已公开的资料,将它的一些常用功能参数和逻辑规则资料进行了汇总整理,希望能助力你的im开发!


[- -]  

[链接] 

[摘要] 今天这篇不是原理性文章,而是为大家分享一下由笔者主导开发实施的im即时通讯聊天系统,针对大量离线消息(包括消息漫游)导致的用户体验问题的升级改造全过程。


[- 10 -] 

[链接] 

[摘要] 本系列文章将尽量从理论概念入手,通俗易懂的梳理im中的基础技术概念和热门技术点,希望能帮你理清看似一团乱麻的im知识体系,助你找到清晰的im技术学习方向。


[- 11 -] 

[链接] 

[摘要] 对于技术门外汉来说,到底什么是im的“实时性”?该如何理解它?这就是本文想要讨论的主题。


[- 12 -] 

[链接] 

[摘要] 本篇主要讲解im系统中的“可靠性”这个话题,内容尽量做到只讲原理不深入展开,避开深层次的技术性探讨,确保通俗易懂。


[- 13 -] 

[链接] 

[摘要] 本文尽量以通俗简显的文字为你讲解im消息时序一致性问题的产品意义、发生原因、解决思路等。


👉52im社区本周新文:《》,欢迎阅读!👈

我是jack jiang,我为自已带盐!https://github.com/jackjiang2011/mobileimsdk/

posted @ 2024-01-10 13:24 jack jiang 阅读(42) | 评论 (0)编辑 收藏

本文由字节跳动技术团队李晨光、匡建鑫、陈鉴平分享,本文有修订和改动。

新媒体互动直播已成为了广大网民最重要的休闲娱乐方式之一。丰富的传统文化、新闻、竞技体育、法律、知识共享等内容,通过移动端互动直播的形式得以更加高效的展现传播,既让优质的直播内容可以实现爆发式传播扩散,又可以让用户有更多的机会感受,学习甚至主动参与直播互动。超低延时视频直播技术正在走上一条全新的发展之路。

本文将带您了解超低延时视频直播技术的优化和演进历程。

 
技术交流:

- 移动端im开发入门文章:《》

- 开源im框架源码:()

(本文已同步发布于:)

本文是系列文章中的第 11 篇,本系列总目录如下:

  • 《》
  • 《》
  • 《》
  • 《》
  • 《》
  • 《》
  • 《》
  • 《》
  • 《》
  • 《》
  • 《》(* 本文

网络基础设施升级、音视频传输技术迭代、 开源等因素,驱动音视频服务时延逐渐降低, 使超低延时直播技术成为炙手可热的研究方向。实时音视频业务在消费互联网领域蓬勃发展, 并逐渐向产业互联网领域加速渗透。经历了行业第一轮的红利爆发期,我国实时音视频行业的场景效能逐渐深化,步入到理性增长阶段。

延时的指标选择很大程度上取决于用户与内容制作方的交互耦合程度,场景丰富多样。

在这些极端场景下,延时在用户侧希望越小越好,接近于实时通信的低延迟模式可以最大化地激发用户的参与感,无缝地与内容生产方产生互动效应,调动用户所见即所得的积极性。比如在主播秀场的pk、送礼、工会冲榜、打赏的活动关键环节,竞争双方的储值大户都希望实时地观察到自身主播在礼物刷榜后的反应,为后台运营决策团队或者后续活动策略提供第一时间的信息反馈。

下图体现了从技术/产品/运营的三方角度来综合思考低延时直播技术的作用;从外部-内部综合因素考虑技术的变迁对整个生态正向循环的影响。

 协议是最传统的直播协议,主播端采用 rtmp 协议推送 h.264/5 和 aac 编码的视音频数据到云厂商 cdn 服务器进行转封装分发,端到端延迟一般控制在 3 到 7 秒。

问题是 rtmp 的可扩展性存在缺陷,同时对于延迟的进一步下探存在一定的技术困难。

rtmp 协议情况下:为了满足延时降低必然压缩播放器的下载缓冲区,这样会引发显著的卡顿问题,使得播放的观感产生不舒适的感受(延时下探至 2 秒以下)。

1)视频延时和弹幕交互的延时存在显著差异,问题聊天内容互动与视频传输图像节奏不匹配:

2)观众与主播互动形式单一,是单向内容传导无法做到双向(在 rtc 技术引入之前无法显著解决)。

3)单向传导的局限第一个方面表现在:观众端拉流传输无法做到根据网络情况自适应调节。用户只能以固定的码率进行流媒体传输无法做到动态感知,在网络情况实时变化的场景(比如弱网,移动基站切换等)固定单向码率传输有较大概率造成丢帧卡顿等因素影响观播体验。另一方面在网络条件更好时,固定码率传输无法动态提升视频传输码率(更高的画质带来更加舒适的体验)

4)在直播和连麦场景共存的互动直播场景下,主播采用传统rtmp推流在遇到连麦pk场景时,会产生推流/本地连麦合流/服务器连麦合流的切换问题,这种场景变换的切换会使得观众端产生瞬间的卡顿问题。如果采用基于webrtc直播技术的超低延时直播方案,这种推流--连麦逻辑的合流切换问题可以得到比较友好的解决(只需要改变服务器转发-订阅流通道的分发逻辑,不涉及推流媒体数据流的旁路调度切换)。

6.1超低延时直播

超低延时直播是近年来新兴起的一类应用。

如电商直播、赛事直播等场景,兼具高并发与低延时的特性,传统直播 3-20s 的时延难以满足其需求,但对实时互动的要求又不及视频会议等典型的实时音视频应用,无需将时延降低至 400ms 以下。

为此,超低延时直播融合了传统直播与实时音视频的技术架构,通过取长补短的方式实现了介于二者之间的端到端时延。

尽管针对超低延时直播厂商尚无一套标准的技术路径,但大体可以归纳为拉流协议、网络架构和推流协议三个方面的改造, 在实际应用过程中,厂商会平衡成本及性能指标等因素,在不同的协议和网络架构之间进行选择。

6.2传输层协议的差异

基于 udp 协议的可靠性优化,为弱网对抗策略提供依据。

传统直播 flv/rtmp 等采用的是 tcp 协议(或者 )tcp 是牺牲传输实时性来换取数据完整性的可靠传输协议。

弱网环境下,其在数据传输前的“三次 握手”连接会带来较大延时。

而 udp 作为不可靠的传输协议,其最大的优点为高实时性,但不保证数据的到达和排序。

实时音视频 产品(如 rtm 超低延时直播)往往采用 udp 协议,并在此之上进行协议层与算法层的优化,来提高传输的可靠性与逻辑性。

相关文章可阅读:

  1. 《》
  2. 《》
  3. 《》
  4. 《》

6.3udp 协议的优化

udp 协议往往和 rtp/rtcp 协议一起在实际应用中出现。

rtp 负责数据传输,其协议头中的序列号、 端口类型、时间戳等字段,可为数据包的分组、组装、排序提供逻辑依据。

rtcp 作为 rtp 的控制协议,负责对 rtp 的传输质量进行统计反馈,并为弱网对抗策略提供控制参数。

a=extmap:18 "http://www.webrtc.org/experiments/rtp-hdrext/decoding-timestamp"

a=extmap:19 "uri:webrtc:rtc:rtp-hdrext:video:compositiontime"

a=extmap:21 uri:webrtc:rtc:rtp-hdrext:video:frame-seq-range

a=extmap:22 uri:webrtc:rtc:rtp-hdrext:video:frame-type

a=extmap:23 uri:webrtc:rtc:rtp-hdrext:video:reference-frame-timestamp

a=extmap:27 uri:webrtc:rtc:rtp-hdrext:audio:aac-config

rtp 使用 rtp 私有扩展头携带 dts/cts 值,每一帧 rtp 数据包通过 rfc5285-header-extension 扩展头携带该帧的 dts 值,每一帧首个 rtp 包和 vps/sps/pps 包通过 rfc5285-header-extension 扩展头携带该帧的 cts 值,通过 pts = dts cts 计算当前帧的时间戳。用于启播快速音画同步和播放器播控逻辑精准音画同步。

扩展头携带帧的起始/结束序号:如果首帧的前几个包丢失,那么可根据起始序号快速发起重传加快首帧;如果当前帧的后几个包丢失,那么可根据该帧的结束序号快速发起重传,降低延时,减少卡顿。

扩展头携带帧的类型:如果携带并解析了正确的帧类型,客户端可以不用解析 metadata ;同时在弱网情形,客户端可以跳过 b 帧直接解码 p 帧,加速出帧并减少潜在卡顿。

扩展头携带 p 帧的参考帧信息:如果发生弱网情形,那么客户端可以依照扩展头指定的参考帧关系及其对应时间戳,跳过 b 帧解码 ,减少卡顿发生。

为了加速信令交互的速度,cdn 可以在某些条件下不去查询媒体信息,直接向客户端返回支持的音视频能力;此时 sdp 的媒体描述中将不包含有具体的音视频配置详细信息。在音频层面,此时answersdp 中不包含 aac 解码所需的头信息;此时我们需要采取 rtp 扩展头模式携带 aac-config 供客户端在 rtp 收包时刻自行解析处理完成解码动作,作用是减少信令交互时间,提升拉流成功率。

minisdp 信令标准实现部分(抖音)。

cdn 信令异步回源。

rtp 携带扩展头组成部分。

rtm 低延时直播基于 webrtc 技术衍生,基于 webrtc 标准构建点到点传输一般有如下几个步骤:

  • 1)通信双方要进行媒体协商,会话详细规范即 sdp(session description protocol) 交互;
  • 2)随后进行交互式网络地址协商(查询对端真实 ip 地址)准备构建媒体传输通道;
  • 3)当上述条件准备完毕即进入最终的 peer to peer 点对点媒体数据传输。

信令部分客户端-服务器单独开发,利用了 sdp 标准报文模式。媒体传输部分采用开源的 webrtc 框架和字节自研的实时音视频媒体引擎进行媒体传输。

minisdp压缩协议:

标准 sdp 比较冗长(5-10kb 左右),不利于快速高效传输。在直播场景下,会尤其影响首帧时间。

minisdp 对标准 sdp 文本协议进行高效能压缩,将原生 sdp 转换成更小的二进制格式,使其能够通过一个 udp 包来传输。

降低信令交互时间,提高网络传输效能,降低直播拉流首帧渲染时间,提高拉流秒开率/成功率等 qos 统计指标。

降低 rtm 信令交互时间,降低 rtm 拉流首帧渲染时间。

原来的流程在服务端缓存不命中时需要等待回源拿到数据,才能返回带有 aacconfig 信息的 answersdp。客户端收到 answersdp 后发送 stun,而服务端只能在收到 stun 才能开始下发数据。

如下图左:当异步回源情况下,服务端不再等待回源结果直接返回 answersdp,之后回源和webrtc 建连流程同步进行。

如上图右:等到 webrtc 建连成功且回源拿到数据立即下发 rtp 数据。

改善人均看播时长,改变 rtc 引擎的组帧/解码策略;禁止 rtc 在低延时模式下的丢帧,改善直播的视频渲染卡顿。

传统的 rtc 场景优先保时延,全链路会触发各种丢帧(包括但不限于解码模块,网络模块),flv 直播场景会优先保证观播体验(不丢帧,良好的音画同步效果)。

rtm 要想减少卡顿,取得 qoe 的收益,播控策略需进行定制化,定制逻辑修改点:

1)确保不会由于软解的解码耗时或者硬解的 dequeuinputbuffer 等其它 api 操作阻塞 jitterbuffer ,内核层有一层强制的音画同步逻辑,可以确保音视频的播放体验;

2)同时上层在监控网络模块和解码模块的缓存长度,有相应的兜底逻辑:

  • a. 判断硬解确实解不过来,dec_cache_frames 过多,上报错误,会降级到软解;
  • b. jitterbuffer 异常,缓存的 frame_list 过多,触发播放器异常逻辑,上报错误,重新拉流。

改善移动端看播渗透,rtc 统一内核方案天生存在缺陷( mediacodec 硬件解码器初始化耗时久)。将 rtm 视频解码模块从 rtc 内核中迁移至 ttmp 播放内核,复用了 flv 的视频解码模块( mediacodec 避免重新初始化)。显著的降低了安卓平台的首帧渲染时间,提升了拉流的成功率。

rtc 内核通用逻辑:

改进的 rtm 内核播控逻辑:

[1]  - 

[2]  - 

[3] 

[4] 

[5] 

[6] 

[7] 

[8] 

[9] 

[10] 

[11] 

[12] 

[13] 

[14] 

[15] 

(本文已同步发布于:)

posted @ 2024-01-04 11:45 jack jiang 阅读(69) | 评论 (0)编辑 收藏

jack jiang的 mail: jb2011@163.com, 联系qq: 413980957, 微信: hellojackjiang
网站地图