首页 > 其他分享 >融云 CTO 岑裕:出海技术前沿探索和排「坑」实践

融云 CTO 岑裕:出海技术前沿探索和排「坑」实践

时间:2023-04-25 12:32:00浏览次数:33  
标签:CTO 岑裕 体验 用户 融云 推送 Push 出海

在本文中,你将看到以下内容:

  • 全球通信网络在接入点、链路加速、服务商、协议等层面的动态演进;
  • 进入到具体市场,禁运国、跨国拦截、区域一致性差等细节“坑点”如何应对;
  • 融云如何从技术侧帮助开发者应对本地化用户体验和业务合规的挑战。

具备全球化视野和能力的新一代创业者,让中国互联网产品发展与全球市场晴雨表同步。关注【融云全球互联网通信云】了解更多

而跟随社交泛娱乐出海热潮蜂拥而至的人和资源,加快了产业在全球市场的成长,也抬高了出海赛道的门槛。

过去相对粗放的出海方式,正在迎来变革时刻,需要对业务做更精细化的运营。具体到各个市场中,通信网络的最后一公里体验本地化用户需求的满足是关键。

在“纵浪潜海 · 2023 融云社交泛娱乐出海赋能会”上,融云 CTO 岑裕以《出海技术前沿探索与排“坑”实践》为主题,分享了融云在上述两方面的持续探索和曲折前进。

融云 CTO 岑裕:出海技术前沿探索和排「坑」实践_通信网络


全球通信网络 最后一公里体验的曲折前进


社交泛娱乐出海的旅程中充满了坑点和痛点,最先要面对的就是各类细节繁琐和意想不到的通信网络问题。

根据网速分析公司 SpeedTest 的数据,2023 年 1 月,全球平均固定互联网连接速度达 76.34Mbps,全球平均移动网络速度达 37.98Mbps。

在其调查的 138 个国家中,东南亚地区的老挝、缅甸、菲律宾、柬埔寨、印尼的移动网速均不达平均值,如下图示。

融云 CTO 岑裕:出海技术前沿探索和排「坑」实践_通信网络_02

移动网速最慢的国家(如下图示)中,有 9 个国家低于 10Mbps。

融云 CTO 岑裕:出海技术前沿探索和排「坑」实践_开发者_03

基础网络状况千差万别之外,近年来,全球通信网络的各个层面还在发生着动态演进,也都会影响业务进入当地市场后的“最后一公里体验”。这主要表现在以下四点:

接入点分配,海外从 SmartDNS 转向 AnyCast。

链路加速,在技术上从 CDN、AnyCast 到 SD-WAN 的迭代,也有一些地区只能使用边缘节点接入。

服务商,AWS、Google、阿里云、CloudFlare、Zenlayer 等各服务商在不同国家的策略和表现不尽相同,各有优势和短板,融合使用多家服务成为基本操作。

协议,出于对加密要求的进一步提升,HTTPS、UDP 等协议兴起。

以上技术迭代,不同地区服务商的迭代进展和支持程度不同,所以在面对全球业务时需要综合使用。

而进入到具体执行层面,还会有更多难以把控的细节“坑点”,比如禁运国、跨国拦截、区域一致性差、DNS 干扰、SSL 加密污染、UDP 拦截、特征包识别、弱网等。


这其中,有一些是常见难题。以跨国拦截为例,我们在地图上看到两个距离相近的国家,会下意识认为它们的连接质量比较好。但实际上,由于地缘政治等原因,物理距离近不等于网络连接好。不同国家、不同运营商,需要针对性实施不同的策略。

还有一些坑点不太常见,但十分棘手。比如在有些地区,当 App 达到一定规模和影响力后,可能会对其流量进行限制。

这些都将极度影响用户体验,出海企业需要投入大量资源进行基础设施的优化。好在,在过去几年出海浪潮的持续拍打之下,相关技术和解决方案也在打磨中日趋完善、成熟。

融云从 2016 年便伴随中国开发者的出海步伐开启全球化布局,在重点地区积累了丰富的服务经验,从东南亚到中东、日韩、拉美和欧美,都有爆款应用基于融云的底层能力虹吸了大量用户。

融云 CTO 岑裕:出海技术前沿探索和排「坑」实践_推送_04

融云在全球通信网络建设上的积累不可一蹴而就,也是其作为专业出海通信服务商的核心优势之一。针对以上问题,融云通过整体方案解决最后一公里的通信难题

☑ 多链路,考虑到投入大小的问题,服务商无法在所有地区保持优势,一般是在不同区域拥有相对优势,这让融合多家服务能力进行统一调度成为基本要求。融云使用多家头部服务商,打造庞大、无拥塞的全球网络。在全球各个地方都有就近接入点,支持动态选择和下发,让用户更快接入服务。

☑ 多协议,支持 TCP、UDP、HTTP、QUIC 等多种协议,以多协议组合来解决跨国拦截的问题,提升在各个地区的服务一致性。

☑ 智能竞速,多链路多协议动态分配,探测回落,并通过本地网络记忆等手段来实现智能竞速,不仅要连得快,还要质量好。

☑ 动态混淆,通过动态混淆对内容进行加密传输,应对因 App 规模发展到一定程度而带来的流量限制等问题。


此外,结合智能心跳、网络记忆多地区统一调度,对服务进行整体优化和全面升级。

开发者通过 SDK 即可与融云服务建立连接,服务架构简洁明了,而背后支撑该架构那些纷繁复杂的协议、策略则被封装隐藏,无需开发者费心。

融云 CTO 岑裕:出海技术前沿探索和排「坑」实践_推送_05

经过一系列优化升级后的融云 SD-CAN V4,全球 P99 连接时长降低了 30%。也就是说,99% 的长尾用户通过多链路、多协议、智能竞速等整体方案实现了连接用时降低 30% 的效果。

融云 CTO 岑裕:出海技术前沿探索和排「坑」实践_推送_06


技术助力本地化 体验与合规


面对新的市场环境和有着不同习惯的海外用户,在战略决策背后,业务全球化更关乎的是一系列执行上的本地化问题。

尤其是热门地区和热门品类的竞争加剧,从岁月静好到“卷生卷死”,胜负手就是对本地用户的理解和需求满足。


融云围绕本地用户体验进行了系列优化,完成了服务品质的一次跃升。

以应用必备的推送能力为例,当语境放至全球市场,基于市场环境和用户群体的差异化,这个功能也生发出了不少坑点。

Android 多厂商推送,国内的小米、OPPO、vivo 等终端在很多海外地区也占据不低的市场份额,应用出海需要在安卓端接入 FCM 推送之外,也要考虑手机厂家推送。并且,不同厂家在国内和海外的推送方式还有一定差异性。

iOS Push Extension,允许应用在接收到推送时立即从服务器拉取消息,而不需要等待应用启动。也就是说,当用户收到一条推送通知,点击进去后即使恰巧遇到进入电梯等情况,也不会因断网而无法查看该消息。

融云 CTO 岑裕:出海技术前沿探索和排「坑」实践_推送_07

Push Extension 的消息拉取是一个单独的进程,需要解决多个进程访问单个 SQLite 数据库文件的问题。并且,不同机型占用内存不同,高端机型 24M / 低端机型 12M,内存非常小的情况下,能够执行的扩展任务不能太复杂。

iOS CallKit,是苹果 iOS10 发布的框架,提供了统一的语音通话 UI 及与该 UI 交互的 API。结合 VoIP Push,使音视频通话类 App 拥有与手机系统一样的来电体验——直接显示在锁屏界面,且通话过程中的音视频权限和运营商电话一样,不会被其他应用打断。

在使用 VoIP Push 时,也有一些细节需要注意。比如,苹果规定客户端收到 VoIP Push 必须弹出通知,否则进程会强制崩溃,所以服务端为保证推送时效而一般会采取的多通道竞速策略就无法实施,需要对保证快速触达的技术模型进行调整。


针对于此,融云对推送能力进行了十分细腻的系列优化。

首先,对全平台推送通道进行优化,覆盖 FCM、APNs 等系统通道及小米、华为、OPPO、vivo 等多数手机厂商,并通过增强兼容性、对设备型号和操作系统版本针对性优化、不同厂商通道优化三大手段提升推送触达率。

其次,支持标签推送,并提供推送多语言模板,让推送更精准,提升用户使用体验。

再次,采用 iOS Push Extension 来保证更好的用户体验,将其作为单独的客户端类型来进行处理和封装。

而 iOS CallKit 和 VoIP Push 的诸多复杂、适配、不便之处,融云也已经在 1V1 音视频通话 SDK 中对所有技术细节进行了妥善处理,开发者集成即可便捷地拥有相应能力,无需自行处理。


除了用户体验的本地化适配,融云还在技术侧帮助开发者面对本地化合规方面的挑战。

☑ 二进制包无中文,一些地区会根据二进制包中是否有中文来简单粗暴地对 App 进行识别,甚至可能导致 App 直接被下架,融云出海解决方案的 SDK 二进制包中均不含中文。

☑ 支持独立的域名和证书,保障业务本地运营的稳定性;针对具体的业务运营,支持定制专门的边缘点入口和加速链路。

 特定区域网络优化,支持开发者进军一些目前相对空白的市场,针对当地的基建状况进行特定地区网络优化。


产业总是在竞争中实现螺旋上升,唯有对技术和产品持续精进,成为一个不断进化的生命体,才能永不落伍地满足业务的迭代需求。

融云,将会继续坚定地走在更专业的出海通信服务商的前进之路上。

标签:CTO,岑裕,体验,用户,融云,推送,Push,出海
From: https://blog.51cto.com/u_14206262/6223769

相关文章

  • 【c&c++】[Error] iostream.h: No such file or directory的解决办法
    直接上错误代码实例#include<iostream.h>intmain(){print('hello,world\n')return0;}编译通不过,直接出错 这是C语言转C++的两条经典错误C++中是没有iostream.h这个东西的(或者一般不会这么使用),正确用法是:#include<iostream>用了iostream还不......
  • 【JPA】LocalContainerEntityManagerFactoryBean与EntityManger的关系
    @Autowired@Qualifier("primaryEntityManagerFactory")privateEntityManagerprimaryEntityManager;@Primary@Bean(name="primaryEntityManagerFactory")publicLocalContainerEntityManagerFactoryBeanprimaryEntityManagerFactory(Entit......
  • pydictor —— 一个强大实用的黑客暴力破解字典建立工具
    pydictor下载环境kalihttps://github.com/LandGrey/pydictor/下载玩解压,然后在pydictor文件夹下打开终端即可。他可以帮助我们快速的生成普通爆破字典、基于网站内容的自定义字典、社会工程学字典等等一系列高级字典还可以使用内置工具,对字典进行安全删除、合并、去重、合并并......
  • 【c&c++】vector 详解(C++)
    C++STL中的verctor好比是C语言中的数组,但是vector又具有数组没有的一些高级功能。与数组相比,vector就是一个可以不用再初始化就必须制定大小的边长数组,当然了,它还有许多高级功能。1.头文件#include<vector>2.初始化 如果vector的元素类型是int,默认初始化为0;如果vector元......
  • yocto中的init manager
    yocto中的initmanager https://blog.csdn.net/qq_35018427/article/details/105487675前言根据前文Linux根文件系统挂载流程中的分析,内核通过调用根文件系统中的init程序跳转到用户空间,并对用户空间所需的基础框架进行初始化。类比于内核启动时,需要对各个功能模块进行初始化,当......
  • Linux 删除 No such file or directory
    -rw-rw-r--1appsapps35859Apr2317:10weblogicdate+%Y%m%d%H%M.log[apps@anvx-8-90logs]$rmweblogicdate+%Y%m%d%H%M.logrm:cannotremove‘weblogicdate’:Nosuchfileordirectoryrm:cannotremove‘+%Y%m%d%H%M.log’:Nosuchfileordirectory......
  • c++ vector容器类元素初始化,resize,reserve
    vector<Person>p;//此处Person为类名,仅此一行代码,会调用p(即vector本身)的构造函数,此时p是空的,其元素的构造函数并未被调用//p.reserve(3);//reserve函数预留空间,一下为源码template<typename_Tp,typename_Alloc>voidvector<_Tp,_Alloc>::reserve(size_ty......
  • 【Visual Leak Detector】源码文件概览
    说明使用VLD内存泄漏检测工具辅助开发时整理的学习笔记。本篇对VLD源码包中的各文件用途做个概述。同系列文章目录可见《内存泄漏检测工具》目录目录说明1.整体概览2.文件夹.teamcity3文件夹lib3.1文件夹cppformat(生成libformat)3.2文件夹dbghelp3.3文件夹gtest......
  • Appium-Server-GUI、Appium-Inspector、Android (SDK tools package)commandlinetools
    公众号回复中增加了最新版Appium和安卓SDK下载链接Appium-Server-GUI-mac-1.22.3-4.dmgAppium-Server-GUI-windows-1.22.3-4Appium-Inspector-mac-2023.4.1Appium-Inspector-windows-2023.4.1(SDKtoolspackage)commandlinetools-mac-9477386_latest(SDKtoolspackage)co......
  • vector动态数组库
    #include<vector>usingnamespacestd;vector<int>vec1;//定义一个空的vector,元素类型为intvector<int>vec2(10);//定义一个大小为10的vector,元素类型为int,初始值为0vector<int>vec3(10,1);//定义一个大小为10的vector,元素类型为int,初始值为1vector<int>vec4={1,2,......