2023年11月9日 随笔档案 -凯发k8网页登录

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

2023年11月9日

     摘要: 本文由字节跳动技术团队杨晨曦分享,本文有修订和改动。1、引言本文将带你一起初步认识thrift的序列化协议,包括binary协议、compact协议(类似于protobuf)、json协议,希望能为你的通信协议格式选型带来参考。  技术交流:- 移动端im开发入门文章:《新手入门一篇就够:从零开发移动端im》- 开源im框架源码:https://github.com/jackj...  阅读全文

posted @ 2023-12-28 10:52 jack jiang 阅读(13) | 评论 (0)编辑 收藏

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

[- 1 -] 

[链接] 

[摘要] 到底是“登陆”还是“登录”?这是很多处女坐开发者纠结的问题,不过它不是本文本讨伦的内容。本文将针对移动端im的登陆功能给出相应的优化建议。


[- 2 -] 

[链接] 

[摘要] 移动网络时代,手机的流量是个很昂贵的资源(至少暂时是这样)。一个典型的移动端im在登录后,往往要向服务器同步非常多的数据,如果处理的不好是很费流量的,那么从技术上来讲,有没有节省流量的方法呢?这就是本文要讨论的话题。


[- 3 -] 

[链接] 

[摘要] 本文将展开聊聊移动端im“多点登陆”与“消息漫游”的原理。


[- 4 -]

[链接] 

[摘要] 如何设计好这个失败重试的机制,使得客户端能做好失败重试,服务器有能够排除这种重复消息,但是排重处理不太复杂?


[- 5 -] 

[链接] 

[摘要] 本文将以基于tcp数据传输协议的移动端im为例,通过循序渐进地方式,分享如何构建一个基于分布式集群的移动端im接入层的设计和实现。


[- -] 

[链接] 

[摘要] 本文来自论文《微信对网络影响的技术试验及分析》,文中研究了微信对现今移动网络的影响,对于即时通讯开发人员来说,文中的某些数据和研究结果,对于实现类似的技术,有一定的参考和借鉴意义。即时通讯网(52im.net)现全文收录之。


[- 7 -] 

[链接] 

[摘要] 首先,介绍即时通信的概念、特点和技术原理,较为全面地剖析了实现即时通信系统涉及的关键技术,包括即时通信传输协议、相关安全技术和音/视频编解码技术等;其次,简要概述了即时通信系统在我校的应用情况;最后,说明当前即时通信工具存在的问题及其发展趋势。


[- 8 -] 

[链接] 

[摘要] 本文将简要介绍teamtalk开源的过去和现在,为打算研究和采用teamtalk的同行提供一定程度的参考。文中所涉及内容如有不妥,还请各位看官见谅。


[- -]  

[链接] 

[摘要] 实际在生产环境下,群消息的发送都会想尽办法进行压缩,并开展各种改善性能的处理办法,而不是像上述举例里的直接扩散写(即2000人群里,一条消息被简单地复制为2000条一对一的消息投递)。具体有哪些优先策略?本文或许可以带给你一些启发。


[- 10 -] 

[链接] 

[摘要] 关于压缩图片在诸如即时通讯应用场景下的好处,我们就不再赘述,不言自明。本篇将承接上篇《qq音乐团队分享:android中的图片压缩技术详解(上篇)》,继续讨论图片的尺寸压缩和常用的几种尺寸压缩算法。


[- 11 -] 

[链接] 

[摘要] 本文内容是由腾讯tmq专项测试团队针对手机qq图片上传速度和成功率问题,在各种复杂移动网络环境下的优化实践总结和整理而成。文章虽是针对手机qq图片上传这一特定业务功能,但内容中大量涉及复杂移动网络环境下无线网络的特性、特点以及相关第一手测试数据,都是非常珍贵的,尤其值得移动端im开发、消息推送这种深度依赖移动网络的应用开发者借鉴和参考。


[- 12 -] 

[链接] 

[摘要] 本文将给读者们一个一年多以前为公司的某产品成功优化网络流量的案例。速度、成功率与流量正好是 apps 网络优化的几大重点,希望本文我们分享的思路能够给诸位正在开展或将来会开展此类工作的读者们一些启发。


[- 13 -] 

[链接] 

[摘要] 本篇中将详细介绍我们的具体分析方法和实践优化思路,以及在优化过程中总结出来的法则等。


[- 14 -] 

[链接] 

[摘要] 本文正文内容引用了微信开发团队的资料。


[- 15 -] 

[链接] 

[摘要] 研究yelp的极致图片压缩技术,或许能给即时通讯开发者同行带来一定的借鉴意义,而这也是此文的意义所在。


[- 16 -] 

[链接] 

[摘要] 本次文章跟大家分享如何在保障质量(指的是图片质量、音视频质量)前提下所做的带宽和网络流量压缩,进而达到运营成本的优化。


[- 17 -] 

[链接] 

[摘要] 本文接上篇《腾讯技术分享:腾讯是如何大幅降低带宽和网络流量的(图片压缩篇)》,继续腾讯公司分享如何在保障质量(指的是图片质量、音视频质量)前提下所做的带宽和网络流量压缩,进而达到运营成本的优化。


[- 18 -] 

[链接] 

[摘要] 所以今天,我将尽量试着以用户的眼光,去描述这样一种现实:什么拳打qq、脚踩微信,自嗨式的创业就像浮云一样......


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

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

posted @ 2023-12-27 15:23 jack jiang 阅读(19) | 评论 (0)编辑 收藏

本文由冰河分享,作者博客 binghe.gitcode.host,原题“这套分布式im即时通讯系统如何写到简历上?我给你整理好了!”,本文有修订和改动。

分布式im即时通讯系统本质上就是对线上聊天和用户的管理。

针对聊天本身来说,最核心的需求就是:发送文字、图片、文件、语音、视频、消息缓存、消息存储、消息未读、已读、撤回,离线消息、历史消息、单聊、群聊,多端同步,以及其他一些需求。

对用户管理来说,存在的需求包含:添加好友、查看好友列表、删除好友、查看好友信息、创建群聊、加入群聊、查看群成员信息、退出群聊、修改群昵称、拉人进群、踢人出群、解散群聊、填写群公告、修改群备注以及其他用户相关的需求等。

为了更好的理解分布式im即时通讯系统的设计,我站在架构师的角度,在充分了解系统需求、业务流程和技术流程后,从全局视角为系统设定方案目标,对技术方案进行选型,对系统进行总体架构设计和分层架构设计,并梳理清楚发送消息的交互链路、单聊和群聊的交互链路。希望对你有帮助。

 
技术交流:

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

- 开源im框架源码:()

(本文已同步发布于:)

在进行技术选型与总体架构设计之前,需要明确一个事项,就是系统无论采用哪种方案,采用哪种架构设计都需要明确这种方案的业务目标、技术目标和架构目标,并在研发过程中不断评估系统的总体性能表现,发现系统瓶颈并不断进行优化。

总体上,我们搭建和开发的分布式im即时通讯系统,需要满足如下方案目标。

具体是:

  • 1)业务目标:满足需求设计篇章中的各类需求场景;
  • 2)技术目标:支持无限扩容,百万用户同时在线聊天;
  • 3)架构目标:高并发、高性能、高可用、可监控、可预警、可伸缩,支持无限扩展。

在技术选型上,除了采用springboot等基础框架外,也会采用容器化方案。

同时,考虑到为了尽量降低技术门槛,在整个分布式im即时通讯系统的技术选型中,主要采用市面上比较流行的技术框架和方案。

具体选型如下所示:

  • 1)开发框架:springboot、springcloud、springcloud alibaba、dubbo;
  • 2)缓存:redis分布式缓存 guava本地缓存;
  • 3)数据库:mysql、tidb、hbase;
  • 4)流量网关:openresty lua;
  • 5)业务网关:springcloud gateway sentinel;
  • 6)持久层框架:mybatis、mybatis-plus;
  • 7)服务配置、服务注册与发现:nacos;
  • 8)消息中间件:rocketmq;
  • 9)网络通信:;
  • 10)文件存储:minio;
  • 11)日志可视化治理:elk;
  • 12)容器化管理:swarm、portainer;
  • 13)监控:prometheus、grafana;
  • 14)前端:vue;
  • 15)单元测试:junit;
  • 16)基准测试:jmh;
  • 17)压力测试:jmeter。

对于im即时通讯系统来说,涵盖了即时通讯后端服务、大后端平台、sdk接入服务、openai接入服务、大前端ui,我相信不少小伙伴多多少少能够画出im即时通讯系统的架构图,大致如下图所示。

 

其实,这种这种架构设计也比较常见,在这种架构设计中,kong/openresty/nginx只做负载均衡和反向代理,研发人员更多的是关注业务层和基础层的开发,流量比较小时,这种架构设计一般不会有什么问题。但是一旦流量比较大,用户调用后端平台的接口发送消息时,即时通讯sdk同步调用即时通讯服务的接口就会出现性能问题。

因为每个终端同时只能与一个im即时通讯服务实例建立连接,如果大量的用户终端恰好都与一个im即时通讯服务建立连接,那即时通讯sdk频繁同步调用同一个im即时通讯服务的接口就会出现性能瓶颈。此时,出现性能瓶颈时,不仅仅会影响到im即时通讯服务,也会对后端平台接收请求的业务造成一定的影响。

既然上节图中所示的架构设计存在性能瓶颈,那我们如何进行优化呢?

为此我们在前图基础上进行了优化,优化后的架构如下图所示。

对比两图可以看出,在屏蔽掉技术实现细节的前提下,我们将对业务的校验和流量管控进行前置化,放大kong/openresty/nginx的职责,使得这些软件不仅具备反向代理和负载均衡的功能,还能实现限流、黑白名单、流量管控、业务校验等功能。

也就是说,在这种架构模式下,我们充分发挥了整个分布式im即时通讯系统的入口职责,充分利用kong/openresty/nginx的高并发、高吞吐量的能力,尽量将大部分无效请求挡在整个系统之外。例如,用户在没登录系统的前提下,就尝试调用发送消息、添加好友、添加群组等等接口。这样会大大减轻后台平台的业务压力。

除了在kong/openresty/nginx中实现限流、黑白名单、流量管控、业务校验等功能外,我们还引入了业务网关集群,实现限流、降级、熔断、流控、校验、鉴权等功能,进一步保证下游系统的稳定性和安全。

为了解决大量用户终端恰好连接到同一个im即时通讯服务实例,im即时通讯sdk频繁调用同一个im即时通讯服务实例的接口造成的性能问题。我们在im即时通讯服务sdk与im即时通讯服务之间引入了rocketmq集群。

im即时通讯服务集群中的每一个im即时通讯服务实例在集群中都有一个唯一的id,并且每个im即时通讯服务实例在启动后,只会监听rocketmq中与自身id相关的topic。这样每个im即时通讯服务只会收到与自身id相关的topic中的消息,不会接收所有的消息。

当用户登录系统后,就会与im即时通讯服务建立长连接,并且会以用户id和终端为key,以im即时通讯服务的id为value,将其存储到分布式缓存中。同时,会以用户id和终端为key,以用户终端与im即时通讯服务建立的长连接为value,将其存储到im即时通讯服务本地内存中。

当用户调用后端平台的接口发消息时,会带上目标用户的id,并且在im即时通讯sdk中会指定用户登录的终端设备,最终会通过im即时通讯sdk向rocketmq发送消息。

此时im即时通讯sdk会根据目标用户id和终端从分布式缓存中获取目标用户连接的im即时通讯服务的id,并向此id相关的topic发送消息。此时与目标用户建立长连接的im即时通讯服务就会接收到rocketmq中的消息,随后根据用户id和终端从本地缓存中获取到与用户终端建立的长连接,并基于此长连接向用户推送消息。

另外,在实际实现中,为了避免大量用户同时只连接im即时通讯服务集群中的某一个服务实例,会对用户连接的ip、浏览器指纹、手机设备等做hash和取模运算,使其尽量均匀分布到集群中的每一个服务实例上。

那么问题来了,这种架构设计还有进一步优化的空间吗?

为进一步增强分布式im即时通讯系统的性能、可用性和弹性伸缩能力,我们可以对分布式im即时通讯系统进行容器化架构设计,如下图所示。

可以看到,我们对分布式im即时通讯系统的架构设计进行了进一步优化,采用了容器化架构设计。在原有架构的基础上,我们进行了如下改进和优化。

1)基础支撑服务:基础支撑服务会由各种基础中间件、数据存储服务、以及监控服务实现,包含:mysql数据库、tidb数据库、hbase、redis缓存、rocketmq消息队列、prometheus监控和portainer容器管理等基础中间件实现,基础支撑服务会对整个分布式im即时通讯系统提供最基础的数据、传输、监控和容器管理等服务。

2)容器化:在容器化层面,会通过docker、swarm和portainer实现,其中,会基于swarm和portainer对容器化进行管理。

3)其他基础性功能实现:除了上述分层架构外,对于建设分布式im即时通讯系统来说,还要考虑异常监控、服务注册与发现、可视化、服务降级与兜底数据、服务限流、服务容灾、容量规划与扩缩容和全链路压测等。

在分布式im即时通讯系统中,不管是大后端平台,还是im即时通讯服务,我们都会对业务层的代码采用分层业务架构。

这里,可以借鉴ddd的分层架构思想,将代码总体上分成展示层、应用层、领域层和基础设施层四个层次。

但是,考虑到分布式im即时通讯系统的特殊性,又不会严格按照ddd的原则来设计代码分层,具体按照如下图所示。

可以看到,分布式im即时通讯系统会借鉴ddd的设计思想,但是不会完全按照ddd的方式进行设计。

1)展示层:展示层,也叫做用户ui层,是ddd设计的最上层,对外提供api接口,接收客户端请求,解析参数,返回结果数据,并对异常进行处理。

2)应用层:应用层,也叫做application层,应用层主要处理容易变化的业务场景,可对相关的事件、调度和其他聚合操作进行相关的处理。

3)领域层:领域层,也叫做domain层,领域层可以说是ddd设计的精髓所在,它是将业务系统中相对不变的部分抽象出来封装成领域模型。在分布式im即时通讯系统的设计中,领域层基本不会依赖其他层,也不会依赖基础设施层,这里是与ddd设计存在区别的地方。

4)基础设施层:基础设施层,也叫做infrastructure层,基础设施层会对其他各层提供通用的基础能力,在分布式im即时通讯系统中,就包括了缓存、通用工具类、消息、系统的持久化机制等。

在分布式im即时通讯系统中,我们忽略掉其他一些细节信息,重点关注下发送消息的交互链路逻辑。不管是单聊还是群聊,最终都需要通过im即时通讯服务将消息推送给用户的终端。此时发送消息的流程如下图所示。

可以看到:用户在分布式im即时通讯系统发送消息时,不管是单聊还是群聊,最终的消息都会推送到用户登录的终端设备上。假设此时用户a给用户b发送消息,或者用户a和用户b在同一个群组,用户a向群组发送消息,用户b接收消息的主要流程如下。

具体是:

  • 1)用户a调用后端平台的接口向用户b发送消息,并且发送的消息中会带有用户b的id以及终端信息;
  • 2)后端平台将消息缓存起来,并且会将消息异步写入消息库;
  • 3)后端平台从redis中获取用户b连接的im即时通讯服务的id;
  • 4)后端平台获取到用户b连接的im即时通讯服务的id后,会向rocketmq中用户b连接的im即时通讯服务id对应的topic发送消息;
  • 5)im即时通讯服务会监听自身服务id对应的rocketmq中topic的消息,此时,用户b连接的im即时通讯服务会接收到消息;
  • 6)im即时通讯服务接收到消息后,会根据用户b的id以及终端信息从缓存中获取用户b与im即时通讯服务建立的连接,并且通过这个连接向用户b推送消息。

要实现如上发送消息的流程,前提是要满足如下条件:

  • 1)后端平台满足分布式条件,可随时横向扩展;
  • 2)im即时通讯服务满足分布式条件,可随时横向扩展;
  • 3)每个启动的im即时通讯服务实例在集群中都有一个唯一的id;
  • 4)每个im即时通讯服务,都只监听自身id对应的rocketmq中topic的消息;
  • 5)用户登录分布式im即时通讯系统后,会与im即时通讯服务建立长连接,并且会根据用户id和所在的终端缓存长连接,同时会根据用户id和所在的终端将连接的im即时通讯服务的id缓存到redis;
  • 6)用户发送消息时,会根据目标用户的id和终端从redis中获取im即时通讯服务的id,进而向当前im即时通讯服务的id对应的rocketmq的topic发送消息;
  • 7)对应的im即时通讯服务监听并接收到rocketmq消息后,会根据目标用户的id和终端从缓存中获取到用户的连接信息,向目标用户推送消息。

单聊就是在分布式im即时通讯系统中,一个用户直接与另外一个用户聊天,也就是一对一的聊天。在这种场景下,很有可能单聊的两个用户中,出现用户不在线的情况。

例如:用户a给用户b发送消息时,用户b可能不在线。

此时,我们就需要将用户a向用户b发送的消息存储起来。

其实,在我们实现的分布式im即时通讯系统中,无论把用户b是否在线,都会存储消息记录。当用户b登录系统后,将消息同步给用户b,如下图所示。

可以看到,用户a向用户b发送消息时:

  • 1)如果用户b在线,就可以按照发送消息的交互链路向用户b发送消息了;
  • 2)如果用户b不在线,此时就无法向用户b正常推送消息。当用户b登录分布式im即时通讯系统后,就会调用后端平台的接口拉取所有未读消息,并通过用户b在线流程向用户b推送消息。

群聊就是在分布式im即时通讯系统中,多个用户在同一个群组中进行聊天。

此时在发送消息时,我们可以通过群组id找出群内所有在线的用户,将消息即时发送给在线的用户。

那些未在线的用户就按照单聊未在线的用户进行处理,如下图所示。

可以看到,群聊的交互链路流程如下所示:

  • 1)用户调用后端平台的接口向群组发送消息;
  • 2)后端平台将消息缓存并异步写入消息库;
  • 3)由于是向群组发送消息,群里有多个用户,此时就会从redis中获取所有用户连接的im即时通讯服务id列表;
  • 4)对用户按照服务id分组,将相同服务id下的用户分在同一个逻辑分组里,方便后续推送消息,并且会记录未在线的用户列表;
  • 5)循环向每个服务id对应的rocketmq中的topic发送消息;
  • 6)广播处理未在线用户的未读消息id;
  • 7)im即时通讯服务会监听自身服务id对应的topic,会随时接收推送到自身服务的消息;
  • 8)当im即时通讯服务接收到消息后,此时用户掉线,或者用户不在线,向用户推送消息就会失败,或者未查询到用户与im即时通讯服务建立的连接,就不会向用户推送消息;
  • 9)当用户登录分布式im即时通讯系统后,会从后端平台拉取历史(离线)消息,并通过用户在线的流程,向用户推送消息;

好了,看到这里,你明白如何设计一个高度可扩展的分布式im即时通讯系统了吗?

[1] 

[2] 

[3] 

[4] 

[5] 

[6] 

[7] 

[8] 

[9] 

[10] 

[11] 

[12] 

[13] 

[14] 

[15] 

[16] 

[17] 

[18] 

[19] 

[20] 

[21] 

(本文已同步发布于:)

posted @ 2023-12-21 11:29 jack jiang 阅读(31) | 评论 (0)编辑 收藏

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

[- 1 -] 

[链接] 

[摘要] 本文将以新手的视角引导你阅读相关文章,便于你从零开发一个移动端im做好方方面面的知识准备:包括但不限于网络编程基础、通信协议的选型、im的架构设计等等。文笔有限,如有不妥之处还请批评指正,希望对你有用。

[- 2 -] 

[链接] 

[摘要] 本文的目的,就是希望以通俗易懂的语言,帮助移动端im开发者更好地理解移动网络的各种特性,使得开发出的功能能更好地适应移动网络,给用户带来更好的使用体验。

[- 3 -] 

[链接] 

[摘要] 本文将针对上篇中提到的特性,结合我们的实践经验,总结了四个方法来追求极致的“爽快”:快链路、轻往复、强监控、多异步,从理论讲到实践、从技术讲到产品,理论联系实际,举一反三,希望给您带来启发。

[- 4 -]

[链接] 

[摘要] 这篇文章和大家聊下从移动端客户端的角度所关注的im消息可靠性和送达机制

[- 5 -] 

[链接] 

[摘要] 本文整理的有关内容,对于移动端即时通讯im应用来说,同样具有启发意义

[- 6 -] 

[链接] 

[摘要] 为了进一步降低运营带宽成本,减小用户访问流量及提升页面加载速度,社交网络 cdn运维紧跟行业图片优化趋势,创新引入webp、sharpp、自适应分辨率、guetzli等图像压缩技术到现网,经过三年多的多部门联合攻关,已逐渐形成一套覆盖全图片类型(jpeg、jpg、png、webp、gif)多场景的图片压缩运营体系,适用于各类型终端,每年节约外网带宽几百g。

[- 7 -] 

[链接] 

[摘要] 本文的写作目的是以最白话地方式,通俗易懂的为你讲清http协议中的session和token等概念,希望读完全文,您仍能满怀信心,继续义无反顾地跳入程序员这个职业深坑 ^_^。更深入的技术细节,请阅读《im开发基础知识补课(四):正确理解http短连接中的cookie、session和token》。

[- 8 -] 

[链接] 

[摘要] 针对上述主流移动im系统中“长”、“短”连接的分工方式,其中最为重要也是用户最先接触到的——就是基于http的sso单点登陆接口(有的系统里可能并不叫sso接口,本文讨论的是其广义:即实现身份认证功能的http接口),那么这个sso接口工作原理是什么?可以怎么来实现?有无最佳实践建议?

[- -]  

[链接] 

[摘要] 实际在生产环境下,群消息的发送都会想尽办法进行压缩,并开展各种改善性能的处理办法,而不是像上述举例里的直接扩散写(即2000人群里,一条消息被简单地复制为2000条一对一的消息投递)。具体有哪些优先策略?本文或许可以带给你一些启发。

[- 10 -] 

[链接] 

[摘要] 这两年多一直从事网易云信 ios 端 im sdk的开发,期间不断有兄弟部门的同事和凯发k8网页登录的合作伙伴过来问各种技术细节,干脆统一介绍下一个im app的方方面面,包括技术选型(包括通讯方式,网络连接方式,协议选择)和常见问题。

[- 11 -] 

[链接] 

[摘要] 自己设计协议的话,协议用字节流好还是字符流好? 各有什么优缺点?

[- 12 -] 

[链接] 

[摘要] 请问有人知道语音聊天的主流实现方式吗?就是类似微信那种,按住说话,录一段,发送那种。这语音文件录好之后是直接转成二进制发送。还是说当成一个文件上传到服务器,然后发送一个消息给对方,对方收到后下载?

[- 13 -] 

[链接] 

[摘要] 本文将要讨论的是即时im应用中极其重要但也不被用户感知的消息送达保证机制(即qos机制),文中将给出目前主流的参考实现思路。

[- 14 -] 

[链接] 

[摘要] 实时在线投递针对的是消息收发双方都在线的情况(如当发送方用户a发送消息给接收方用户b时,用户b是在线的),那如果消息的接收方用户b不在线,系统是如何保证消息的可达性的呢?这就是本文要讨论的问题。

[- 15 -] 

[链接] 

[摘要] 实时消息时序和一致性是分布式系统架构设计中非常难的问题(尤其im应用这种以消息为中心的应用形态),困难在哪?有什么常见优化实践?这就是本文要讨论的内容。

[- 16 -] 

[链接] 

[摘要] im类系统中,都需要考虑消息时序问题,如果后发送的消息先显示,可能严重扰乱聊天消息所要表达的意义。

[- 17 -] 

[链接] 

[摘要] “用户在线状态的一致性”(单聊好友在线状态、群聊用户在线状态)是im应用领域比较难解决的一个技术问题,如何精准实时的获得好友、群友的在线状态,是今天将要探讨的话题。

[- 18 -] 

[链接] 

[摘要] 由于“消息风暴扩散系数”的存在(概念详见《im单聊和群聊中的在线状态同步应该用“推”还是“拉”?》),群消息的复杂度要远高于一对一的单聊消息。群消息的实时性、可达性、离线消息是今天将要讨论的核心话题。

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

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

posted @ 2023-12-21 10:30 jack jiang 阅读(32) | 评论 (0)编辑 收藏

本文由networkfox分享,来源于华三通信,原题“什么是国密算法?”,本文有修订和改动。

最近几年经常能听到im应用的开发者讨论国产信创方面的技术问题,在某些场景下,国密算法是硬性要求,所以学习一下国密算法还是很有必要的。

国密算法是指由中国国家密码管理局发布的密码算法标准,旨在保障国家信息安全。目前,国家密码管理局已发布了一系列国产商用密码标准算法,包括sm1(scb2)、sm2、sm3、sm4、sm7、sm9以及祖冲之密码算法(zuc)等。通过在金融、电子政务及安防等领域广泛应用国密算法,在对敏感数据进行机密性、完整性和可用性保护的同时,减少对外部密码产品的依赖,提升国家信息安全水平。

本文将尽量以通俗易懂的文字,为你分享国密算法的种类、技术原理和应用场景等。

 
 
技术交流:

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

- 开源im框架源码:()

(本文已同步发布于:)

本文是im通讯安全知识系列文章中的第12篇,此系列总目录如下:

《》

《》

《》

《》

《》

《》

《》

《》

《》

《》

《》

《》

《》(* 本文)

3.1国密算法的产生背景

在网络信息传输和存储过程中,数据的保密性和安全性是一项重要的需求。

传统的国际标准加密算法虽然安全可靠,但由于无法保证源代码的安全性,因此存在着源代码被外部恶意攻击者渗透或篡改的风险。为了构建安全的行业网络环境并增强国家行业信息系统的“安全可控”能力,中国积极开展了针对信息安全需求的研究和探索。

自2007年开始,中国制定了国密算法标准,并于2010年正式发布。

经过多年的发展、改进和完善,国密算法已成为中国自主研发的密码算法标准,并在各行业得到广泛应用。它的诞生不仅显著提升了中国在密码技术领域的核心竞争力,还为国家信息安全建设作出了重要贡献。

3.2国密算法的特点

国密算法具备如下特点:

1)安全性高:国密算法采用了严密的密码学原理和复杂的运算方式,具有较高的安全性。它在加密、数字签名和哈希等功能上都能提供可靠的保护,抵抗了各种传统和现代密码攻击手段。

2)高效性与灵活性:国密算法在保证安全性的同时,注重算法的效率。它的加密速度和运行效率相对较高,同时也能适应不同的密码长度和密钥长度,以满足不同场景的需求。

3)标准化广泛:国密算法已被国家标准化机构认可和采用。它符合国际密码学标准的基本要求,具备与国际算法相媲美的能力。同时,国密算法也在国内推广和应用广泛,成为中国信息安全领域的基础核心算法之一。

4)自主创新:国密算法是中国自主研发的密码算法,所以对于算法的实现和推广都具有独立的掌控能力。这意味着中国可以更好地保护自己的国家信息安全,减少对外依赖,提高自主抵抗能力。

5)面向多领域应用:国密算法不仅局限于某个特定领域的应用,它适用于金融业、电子商务、通信、物联网、区块链等不同领域的信息安全保护。它的广泛应用范围使得国密算法可以满足不同行业的安全需求。

国密算法包括sm1(scb2)、sm2、sm3、sm4、sm7、sm9以及祖冲之密码算法(zuc)等。

其中:

  • 1)sm1、sm4、sm7、祖冲之密码(zuc)属于对称算法;
  • 2)sm2、sm9属于非对称算法;
  • 3)sm3属于杂凑算法。

下文将主要介绍国密算法中的常用算法sm1、sm2、sm3和sm4的实现和应用。

sm1算法是国密算法中的一种对称加密算法,其特点是加解密使用相同密钥。利用sm1对称加密算法加解密数据的过程。

sm1算法未公开,仅以ip核(intellectual property core,一种预先做好的集成电路功能模块)的形式存在于芯片中。

sm1算法主要用于小数据量的加密保护,因此被广泛用于研制智能ic卡、智能密码钥匙、门禁卡、加密卡等安全产品。

6.1概述

sm2算法是基于ecc(elliptic curve cryptography)椭圆曲线的非对称加密算法,包括了sm2-1椭圆曲线数字签名算法、sm2-2椭圆曲线密钥交换协议和sm2-3椭圆曲线公钥加密算法,分别用于实现数字签名、密钥协商和数据加密等功能。

sm2算法在许多领域都有广泛的应用。

在电子商务领域:sm2算法被用于保护用户个人信息的安全传输,确保用户在网上交易过程中的隐私和财产的安全。

在互联网金融领域:sm2算法被用于数字支付、电子银行等场景,实现用户身份认证和交易的安全性。

此外,sm2算法还适用于物联网领域,保护物联网设备之间的通信安全,确保数据的可靠传输。

6.2数据加密

在非对称加密算法中,可对外公布的密钥称为“公钥”,只有持有者所知的密钥称为“私钥”。发送者使用接收者的公钥来加密消息,接收者用自己的私钥解密和读取该消息。

利用sm2非对称加密算法加解密数据的过程:

6.3密钥协商

由于椭圆曲线的计算复杂性高,破解难度大,因此sm2算法在密钥协商技术领域也起着关键作用。

利用sm2算法进行密钥协商的过程:

  • 1)会话双方生成自己的私钥(随机数);
  • 2)会话双方由私钥、ecc椭圆曲线参数g各自计算出公钥;
  • 3)会话双方将自己的公钥传递给对方,传递过程公开。由于椭圆曲线的计算复杂性高,破解难度大,因此攻击者难以通过公钥和椭圆曲线参数g反推出私钥;
  • 4) 双方将自己的私钥与对方的公钥进行运算,最终得到相同的会话密钥,该会话密钥可作为共享密钥用于对称加密(例如sm4算法)通信。

6.4数字签名

数字签名是一种用于验证信息完整性、真实性和来源的技术手段。它通常用于确保数据在传输或存储过程中没有被篡改,并且可以追溯到特定的发送方。

发送方使用自己的私钥对消息进行加密,生成数字签名。接收方使用发送方的公钥对签名进行解密和验证,以验证消息的完整性和真实性。

在数字签名应用中,sm2算法通常与sm3摘要算法一起使用。

sm3杂凑(hashing)算法是国密算法中的一种摘要算法。

sm3算法通过哈希函数将任意长度的消息压缩成固定长度的摘要。摘要具有唯一性,即不同信息生成的摘要不同,且无法由摘要恢复出原始信息,更无法伪造信息获得相同摘要,因此sm3算法被广泛用于实现数字签名、数据完整性检测及消息验证等功能。

基于sm3算法的特点,在信息安全领域,sm3算法被用于保护密码学协议、数字证书和电子签名等数据的完整性。在区块链领域,sm3算法被用于加密货币的区块生成和链上交易的校验,确保区块链的安全性。

此外,sm3算法还可以应用于密码学随机数的生成和伪随机序列的校验等领域,增加了数据的安全性和可靠性。

利用sm2算法和sm3算法对用户数据进行数字签名认证及完整性校验的过程:

  • 1) 用户a发送的数据a经过sm3哈希算法运算生成摘要a。
  • 2) 摘要a经过用户a的私钥加密生成数字签名。
  • 3) 用户a的明文数据和数字签名经加密算法(sm1/sm2/sm4)加密成密文后发送给用户b。加密算法以非对称加密算法sm2为例,即加解密使用不同密钥。
  • 4)密文到达用户b处,经加密算法(sm1/sm2/sm4)解密后,还原成明文数据和数字签名。
  • 5)用户b使用用户a的公钥解密数据包中的数字签名:
  •      解密成功,数据来源合法,得到摘要a;
  •      解密失败,数据来源非用户a,丢弃本次数据。
  • 6)收到的数据包中的明文数据经过sm3哈希运算生成摘要a’。对比摘要a和摘要a’:
  •      摘要a’=摘要a,数据完整;
  •      摘要a’≠摘要a,数据被篡改,丢弃本次数据。

8.1概述

与sm1算法分类相同,sm4算法同样为分组对称加密算法,但sm4算法实现公开。

分组加密算法是将明文数据按固定长度进行分组,用同一密钥逐组加密,密文解密时同样使用相同密钥逐组解密。

sm4算法实现简单,因此加解密速度较快,消耗资源少,主要用于大数据量的加密和解密,例如静态储存或数据信号传输通道中数据的加解密。

在网络安全领域,sm4算法被用于保护网络传输和存储的敏感数据,如银行卡信息、密码等。在物联网领域,sm4算法被用于物联网设备之间的通信和数据加密,确保物联网数据的隐私安全。

此外,sm4算法还可以应用于区块链领域,保护加密货币的交易安全等领域,为相关系统和数据的安全提供了保障。

sm4算法支持ecb、cbc、cfb等多种分组模式,下文将介绍ecb和cbc两种基础模式。

8.2加解密模式:ecb模式

sm4算法基于ecb模式对数据加解密的过程:

  • 1)发送端将明文按固定长度分组,对每个明文分组分别使用相同的密钥进行加密生成密文分组。完整的密文由所有密文分组按序排列组合而成;
  • 2)接收端将密文按固定长度分组,对每个密文分组分别使用相同的密钥进行解密生成明文分组。所有明文分组按序排列组合而成完整的明文数据。

ecb模式实现简单,各段数据间互不影响,有利于并行运算,但相同的明文块会被加密成相同的密文块,不能提供严格的数据保密性。

8.3加解密模式:cbc模式

sm4算法基于cbc模式对明文加密的过程:

  • 1)将明文按固定长度分组;
  • 2)明文分组1与初始向量iv进行异或运算,异或运算的结果经密钥加密后得到密文分组1;
  • 3)剩余的明文分组依次与前一个密文分组进行异或运算后再加密,得到对应的密文分组;
  • 4)完整的密文由所有密文分组按序排列组合而成。

sm4算法基于cbc模式对密文解密的过程:

  • 1)将密文按固定长度分组后,对密文分组进行倒序处理;
  • 2)对密文分组n先使用密钥进行解密,密文分组n解密后的数据与密文分组n-1进行逻辑逆运算,得到明文分组n;
  • 3) 同理,剩余的密文分组解密后再与前一个密文分组进行逻辑逆运算,得到对应的明文分组;
  • 4)最后,密文分组1用密钥解密后的数据是与初始向量进行逻辑逆运算,然后得到明文分组1;
  • 5)完整的明文由所有明文分组按序排列组合而成。

cbc模式安全性高于ecb,但明文块不能并行计算,且误差会传递下去。

国密算法和国际标准算法都是现代密码学中常用的加密算法,但在技术和优劣方面存在一些区别。

常见国密算法与国际标准算法各参数性能的对比如下:

 

10.1ad-wan纵向ip/mpls组网

国密算法可以与ad-wan技术结合,应用于ip/mpls纵向网场景。

通过ad-wan智能运维平台,实现国密配置一键下发,在网络中构建国密数据加密通道,实现基于国密的端到端的ipsec隧道保护。

国密算法在端到端的ipsec隧道中的工作原理如下:

1)在ike密钥协商阶段,使用ike协议进行密钥协商过程中,采用sm2算法生成会话密钥。

2)在身份认证阶段,本端使用sm2和sm3算法生成身份信息的数字签名,并使用sm1或sm4算法和会话密钥对身份信息和数字签名进行加密;对端收到加密的身份信息后,使用相同的会话密钥解密,然后通过sm2和sm3算法进行身份认证。

3)在数据传输阶段,本端使用sm2和sm3算法生成用户数据的数字签名,并使用sm1或sm4算法以及会话密钥对用户数据和数字签名进行加密;对端收到加密的用户数据后,使用相同的会话密钥解密,然后通过sm2和sm3算法进行数据完整性检查。

10.24g/5g vpdn业务组网

4g/5g vpdn(virtual private dialup network,虚拟专有拨号网络)业务是在4g/5g无线网络中采用拨号方式实现的一种虚拟专有网络业务。它利用l2tp技术为客户构建与互联网隔离的隧道,以满足客户分支和总部内网通信的需求。vpdn组网同时支持将l2tp和ipsec技术结合,通过l2tp完成用户认证确保接入安全,并利用ipsec保障通信数据安全。

1)4g/5g vpdn组网中分支网关由4g/5g路由设备担任,通过拨号接入运营商网络。

2)运营商对4g/5g路由设备的apn(access point name,接入点名称)、账户、sim/usim卡信息进行认证。

3)4g/5g路由设备认证通过后被运营商判断是vpdn用户,同时由运营商aaa服务器向lac(l2tp access concentrator,l2tp访问集中器)设备下发l2tp隧道属性,lac设备将基于下发的l2tp隧道属性信息向该vpdn用户所属总部的lns(l2tp network server,l2tp网络服务器)设备发起隧道建立请求。

4)l2tp隧道建立后,lac设备会通过此隧道向lns设备透传用户的认证信息。lns设备向总部内网的aaa服务器发起对vpdn用户的二次认证,认证通过后为vpdn用户分配一个企业内网ip地址。分支终端用户和总部可以开始通信。

5)分支网关与总部网关设备上均安装有国密板卡,通过ipsec协商建立起端到端的ipsec隧道,使用国密算法对传输的数据报文进行加密保护和数据完整性检查。

6)经ipsec加密后的数据报文在lac设备处进行l2tp封装后,通过l2tp隧道传输到lns。

7)lns收到数据报文后首先对l2tp报文进行解封装,然后经过ipsec解密还原出数据报文,根据报文目的ip地址转发报文。

[1] 

[2] 

[3] 

[4] 

[5] 

[6] 

[7] 

[8] 

[9] 


(本文已同步发布于:)

posted @ 2023-12-14 11:06 jack jiang 阅读(46) | 评论 (0)编辑 收藏

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

[- 1 -] 

[链接] 

[摘要] 本次专访是对谷沉沉老师在即将到来的 2017archsummit 全球架构师峰会上,以《数亿微信视频通话背后的视频技术二三事》为题发表演讲的一次预热。


[- 2 -] 

[链接] 

[摘要] 腾讯音视频实验室和优图实验室x-lab的戴宇榮老师的团队联合开发的基于神经网络的实时视频超分辨率技术,在极小的神经网络模型大小的条件下,在手机实时视频通话上实现了基于机器学习的超分辨率技术,起到了主观上提升一档分辨率的效果。此技术即将应用在手机qq 7.3.5的ios版本上的实时视频聊天。


[- 3 -] 

[链接] 

[摘要] 本文将为大家介绍微信实时音视频聊天在不同发展阶段的各个关键视频技术环节采用的方案,同时分享在实时音视频聊天中的视频编码器研发的方法和经验。


[- 4 -]

[链接] 

[摘要] 本文汇总了一些能帮助到正在学习或进行实时音视频开发的同行们的开源工程,这些工程分为几类:音视频编解码类、视频前后处理、服务端类等,希望能加速您的学习或研究过程。


[- 5 -] 

[链接] 

[摘要] 从直播在线上抓娃娃,不断变化的是玩法的创新,始终不变的是对超低延迟的苛求。实时架构是超低延迟的基石,如何在信源编码、信道编码和实时传输整个链条来构建实时架构?在实时架构的基础之上,如果通过优化采集、编码、传输、解码和渲染中的关键环节来降低延迟?本文将会介绍即构在这方面的思考与实践。


[- 6 -] 

[链接] 

[摘要] 音视频实时通讯的应用场景已经随处可见,从“吃鸡”的语音对讲、直播连麦、直播答题组队开黑,再到银行视频开户等。对于开发者来讲,除了关注如何能快速实现不同应用场景重点额音视频通讯,另一个更需要关注的可能就是“低延时”。但是,到底实时音视频传输延时应该如何“低”,才能满足你的应用场景呢?


[- 7 -] 

[链接] 

[摘要] 本文是由一篇演讲稿整理出来的文章,目标读者是对实时音视频开发感兴趣但是又不知道如何下手的初学者们,对大家有所帮助。


[- 8 -] 

[链接] 

[摘要] 腾讯多媒体内核中心高级研究员时永方接受了livevideostack的邮件采访,谈及了个人成长中的关键时刻,学习多媒体开发的三点核心,以及在5g和高清时代下,微信多媒体团队面临的挑战。


[- 9 -]  

[链接] 

[摘要] 本文来自腾讯视频云终端技术总监rexchang(常青)的技术分享,讲述的是微信小程序中音视频技术构思、设计和实现等方方面的内容,希望能为你的音视频技术实践带来启发。


[- 10 -] 

[链接] 

[摘要] 从华为2012实验室到腾讯,过去十余年梁俊斌一直专注在音频技术。他告诉livevideostack:音频技术还有许多难点需要解决,而作为技术人也延展到应用场景,关注用户需求。本文整理了本次访谈的主要内容,仅供参阅。


[- 11 -] 

[链接] 

[摘要] 本文的短视频技术跟im的单聊、群聊、朋友圈里的小视频是类似的东西,文中针对短视频的相关优化实践可以为您的im小视频开发提供一定的参考和借鉴意义,希望对您有用。


[- 12 -] 

[链接] 

[摘要] 本文将尝试从开发者角度:梳理开发网游服务端的网络接入层的过程中面临的各种技术挑战,并针对性地提供相应的实时通信网络接入层解决思路,希望对于即时通讯应用的开发者来说,可以从中得到些许启发。


[- 13 -] 

[链接] 

[摘要] 本文来自腾讯视频云终端技术总监rexchang(常青)技术分享,内容分别介绍了微信小程序视音视频和webrtc的技术特征、差异等,并针对两者的技术差异分享和总结了微信小程序视音视频和webrtc互通的实现思路以及技术方案。希望能带给你启发。


[- 14 -] 

[链接] 

[摘要] 本文以轻松幽默的语气,讲解了视频编解码的一些基本常识,并以爱奇艺为例,讲述了视频编解码技术在国内的发展以及未来的一些展望。


[- 15 -] 

[链接] 

[摘要] 本文是作者自已根据入门实时音视频的亲身经历,对于基础知识点的认知总结。虽然很浅显,但相对小白来说,能稍微系统的了解这些概念就已经是很好的起点了。


[- 16 -] 

[链接] 

[摘要] 本文将通过通俗的文字,言简意赅地为你讲解实时音视频技术中跟视频技术在关的11个非常重要的基础知识概念,希望能为你日后从事这方面的工作起到抛砖引玉的作用。


[- 17 -] 

[链接] 

[摘要] 本文将从视频编解码技术的基础知识入手,引出视频编解码技术中非常基础且重要的预测技术,学习帧内预测和帧间预测的技术原理。


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

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

posted @ 2023-12-13 11:57 jack jiang 阅读(49) | 评论 (0)编辑 收藏

是一套web网页端im系统,是的姊妹系统(rainbowchat是一套基于开源im聊天框架  ()  的产品级移动端im系统)。

► 详细介绍:
► 版本记录:
► 运行截图:
► 运行视频:

此版更新内容():

  • 1)[bug][服务端] - 解决了群成员从凯发k8网页登录首页“消息”列表中删除已解散群的item时没有反应的问题;
  • 2)[新增][服务端] - 安全提升,实现了一套新的token生成、校验机制(支持对称加密和非对称加密两种模式);
  • 3)[新增][服务端] - 安全提升,启用了appkey校验机制;
  • 4)[新增][前端]    - 优化了http接口、文件上传接口校验逻辑,提升安全性;
  • 5)[新增][前端]    - 安全提升,启用了appkey校验机制;
  • 6)[新增][前端]    - 新增发送“群名片”消息功能;
  • 7)[新增][前端]    - 新增了消息转发功能;
  • 8)[优化][前端]    - 其它细节优化等。

“群名片”功能运行截图):

“消息转发”功能():

posted @ 2023-12-11 12:08 jack jiang 阅读(37) | 评论 (0)编辑 收藏

     摘要: 本文由字节跳动技术团队高原、汤中峰分享,原题“抖音功耗优化实践”,本文有修订和改动。一、引言功耗优化是应用体验优化的一个重要课题,高功耗会引发用户的电量焦虑,也会导致糟糕的发热体验,从而降低了用户的使用意愿。而功耗又是涉及整机的长时间多场景的综合性复杂指标,影响因素很多。不论是功耗的量化拆解,还是异常问题的监控,以及主动的功耗优化对于开发人员来说都是很有挑战性的。本文结合抖...  阅读全文

posted @ 2023-12-07 11:37 jack jiang 阅读(73) | 评论 (0)编辑 收藏

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

[- 1 -] 

[链接] 

[摘要] 在视频或者音频通话过程中,一方面为了减小原始声音数据的传输码率,需要进行音频压缩,另一方面为了得到更高质量的音质,需要进行音频处理。如何处理好这两方面,保证声音传播的高真性,是个技术活儿!

[- 2 -] 

[链接] 

[摘要] 随着音频处理和压缩技术的不断发展,效果更好、适用范围更广、性能更高的算法和新的技术必将不断涌现,不断改善我们的生活。

[- 3 -] 

[链接] 

[摘要] 本文对这些协议进行初步归纳总结,在分析rfc3550的基础上,重点分析rtp系列协议,并以报文类型为主线分析rtcp系列协议。

[- 4 -]

[链接] 

[摘要] 本文来自论文《基于 rtmp 协议的流媒体技术的原理与应用》,文中研究了基于 flash 平台的流媒体系统中使用的 rtmp 协议的原理和应用,并对网络上实时流媒体的各种传输方式的优缺点进行了分析。

[- 5 -] 

[链接] 

[摘要] 孙雨润,声网 agora.io 首席音视频架构师,负责全球音视频传输技术架构。毕业于中国科学技术大学,原 yy 后台架构师,主导 web yy 整体后台系统架构搭建。曾任职腾讯 qq 研究员 ,主导 qq 空间面孔墙等项目;任职微软 microsoft 期间,参与高性能计算产品项目。

[- 6 -] 

[链接] 

[摘要] 实时语音聊天开发,对于一般的开发者来说比较神秘,很多朋友不太清楚如何全面的评估一个音频引擎。

[- 7 -] 

[链接] 

[摘要] 本文总结了一些有关实时音视频方案比较值得自测的要点,旨在没有生产环境反馈和丰富的测试资源情况下,用较低的成本来测试覆盖尽可能多的真实场景中可能遇到的网络和设备问题。

[- 8 -] 

[链接] 

[摘要] 本文着重阐述端到端加密(e2ee),端到端加密是确保数据传输安全的可行方法之一。读完这篇文章,你可以了解这种加密方式的基本原理.

[- -]  

[链接] 

[摘要] 本次分享就向大家介绍一下分享一下直播的整个流程和一些技术点,并动手实现一个简单的demo。

[- 10 -] 

[链接] 

[摘要] 为了不让文章读起来枯燥,本文将尽量通俗易懂地为您讲解实时音视频聊天场景下的回声消除技术原因希望能带给你些许启发。

[- 11 -] 

[链接] 

[摘要] 要在语音视频 sdk 中实现超低延迟,实时的语音视频传输机制是必不可少的,而 fec 和 arq 的智能结合是实时语音视频传输机制的基石。

[- 12 -] 

[链接] 

[摘要] 本文是系列文章的第一篇:讲述视频编解码的一些基本知识。

[- 13 -] 

[链接] 

[摘要] 实时视频直播是这两年非常火的技术形态,已经渗透到教育、在线互娱等各种业务场景中。但要搭建一套实时视频直播系统,并非易事,当然相关的直播技术理论在论坛的其它文章里已经写的非常详细,本文不再展开。

[- 14 -] 

[链接] 

[摘要] 网易云信的实时视频直播目前使用了tcp进行传输,且基于此,从编码动态适配、发送队列调整、协议优化、socket等做了全流程的优化,确保在限带宽、丢包、时延、抖动,无论单项还是复杂网络,都有非常不错的实际体验。

[- 15 -] 

[链接] 

[摘要] 编解码器面向直播和网络通信是不一样的,我今天想说的是面向不可靠传输网络的抗丢包编解码器。

[- 16 -] 

[链接] 

[摘要] 那整个系统是怎么设计的?使用了哪些技术来达成目标?接下来我来重点分享一下架构设计和技术细节。

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

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

posted @ 2023-12-06 12:22 jack jiang 阅读(53) | 评论 (0)编辑 收藏

     摘要: 本文由竹子爱熊猫分享,原题“(十一)netty实战篇:基于netty框架打造一款高性能的im即时通讯程序”,本文有修订和改动。1、引言关于netty网络框架的内容,前面已经讲了两个章节,但总归来说难以真正掌握,毕竟只是对其中一个个组件进行讲解,很难让诸位将其串起来形成一条线,所以本章中则会结合实战案例,对netty进行更深层次的学习与掌握,实战案例也并不难,一个非常朴素的i...  阅读全文

posted @ 2023-11-30 12:28 jack jiang 阅读(53) | 评论 (0)编辑 收藏

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

[- 1 -] 

[链接] 

[摘要] 本文主要讲解实时音视频技术中视频技术的编解码基础理论。

[- 2 -] 

[链接] 

[摘要] 本文主要讲解实时音视频技术中视频技术的数字视频知识。

[- 3 -] 

[链接] 

[摘要] 本文主要讲解实时音视频技术中视频技术的编码理论知识。

[- 4 -]

[链接] 

[摘要] 本文主要讲解实时音视频技术中视频技术的预测技术理论知识。

[- 5 -] 

[链接] 

[摘要] 本文主要讲解实时音视频技术中目前主流的视频编码技术h.264相关知识。

[- 6 -] 

[链接] 

[摘要] 本文是一篇讲述新手如何学习音频编解码知识的文章。

[- 7 -] 

[链接] 

[摘要] 本文是一篇讲述基础音频知识和编码原理的文章。

[- 8 -]  

[链接] 

[摘要] 本文是一篇讲述常用的实用音频通讯编码标准的文章。

[- 9 -] 

[链接] 

[摘要] 本文是一篇介绍实时音频通讯过程中的回音问题,以及回音消除技术的介绍文章。

[- 10 -] 

[链接] 

[摘要] 本文是一篇详细介绍实时音频通讯过程中的回音消除技术的文章,主要描述的是回音消除技术理论和算法原理等。

[- 11 -] 

[链接] 

[摘要] 本文是一篇详细介绍实时语音通讯过程中的丢包补偿技术的文章。

[- 12 -] 

[链接] 

[摘要] 虽然都是视频通讯,大部分情况下的单人视频通话可能根本不需要用到流媒体服务,而多人视频,如在线教育这些则必须用到,所以下面主要介绍多人视频中服务端架构模式,以及各自特点。

[- 13 -] 

[链接] 

[摘要] 本文主要讲解实时音视频技术中最流行的视频编码技术h.264的特点和优势,希望能为您的技术选型提供一定的参考。

[- 14 -] 

[链接] 

[摘要] 本文将简要介绍这些主流的实时音视频数据传输协议。

[- 15 -] 

[链接] 

[摘要] p2p就是点对点,两个客户端直接进行数据交互,不需要经过服务器转发(relay),这种方式能大大减轻服务端的负载,所以特别视适合大数据的传输,比如实时音视频聊天、在线视频直播、大文件传输等应用场景。

[- 16 -] 

[链接] 

[摘要] 本文将就几个典型问题给出简要的参考建议。

[- 17 -] 

[链接] 

[摘要] 本文重在为读者从技术角度讲解h.264和vp8的发展渊源以及现时所面临的问题,相信读完此文后,对于即时通讯(im聊天应用)的实时音视频开发中视频编码的选择会有个直观的了解。

[- 18 -] 

[链接] 

[摘要] 以下就是本次为大家分享的主要内容,希望通过此次分享可以使大家对音频编解码有一个整体的认识,并在实际应用中有参考的依据。

[- 19 -] 

[链接] 

[摘要] 视频编码技术涉及的内容太过专业和庞杂,市面上的书籍或博客多数都只是枯燥的技术概念罗列,对于新手来说读完依旧蒙逼是常态,本文将借此机会,专门给大家做一个关于视频编码的零基础科普。

[- 20 -] 

[链接] 

[摘要] 本文将以通俗易懂的文字,引导你理解视频是如何从采集开始,历经各种步骤,最终通过颜色模型转换和不同的色域转换,让你看到赏心悦目的视频结果的。

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

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

posted @ 2023-11-29 13:41 jack jiang 阅读(46) | 评论 (0)编辑 收藏

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

[- 1 -] 

[链接] 

[摘要] 作为google开源的技术,webrtc并不是一个可以拿来就用并且性能很好的产品,而且正如众多的其它开源技术一样,webrtc的发展并没有期待中的快。


[- 2 -] 

[链接] 

[摘要] 作为google开源的技术,webrtc并不是一个可以拿来就用并且性能很好的产品,需要工程师们对其进行较多的改善。本文主要来谈一谈webrtc的优缺点。


[- 3 -] 

[链接] 

[摘要] 首届(webrtc)网络实时通信大会期间,infoq 对 webrtc 之父 daniel c. burnett 进行了专访,以下是专访实录。(注:daniel 在访谈中的观点仅代表他本人及其在 w3c 所做的工作。)


[- 4 -]

[链接] 

[摘要] webrtc,名称源自网页实时通信(web real-time communication)的缩写,是一个支持网页浏览器进行实时语音通话或视频聊天的技术,是谷歌2010年以6820万美元收购global ip solutions公司而获得的一项技术。


[- 5 -] 

[链接] 

[摘要] 虽然webrtc的目标是实现跨平台的web端实时音视频通讯,但因为核心层代码的native、高品质和内聚性,开发者很容易进行除web平台外的移殖和应用。很长一段时间内webrtc是业界能免费得到的唯一高品质实时音视频通讯技术。


[- 6 -] 

[链接] 

[摘要] 通过webrtc的端到端通信通常被人们所误解。webrtc并不是真正意味着你不需要服务器来协商和联接通话。它只意味着,在多数情况中,你可以直接地在浏览器之间进行通信。


[- 7 -] 

[链接] 

[摘要] 本文主要介绍webrtc的架构和协议栈。


[- 8 -]  

[链接] 

[摘要] 现在大大小小的公司,甚至个人开发者,都想开发自己的直播网站或app,本文会帮你理清,开发视频直播平台,你需要注意哪些技术要点。


[- 9 -] 

[链接] 

[摘要] 对实时音视频开发者来说,当开发一个基于webrtc的产品时,我们应该选择什么样的视频编解码器?去年的时候,答案可能是“vp8”。几个月前,答案可能是“看情况”。现在答案是“除非必须用vp8,否则就用h.264”。


[- 10 -] 

[链接] 

[摘要] 利用google开源的webrtc来开发自已的实时音视频系统,靠不靠谱这个问题一直被问到,其实很难一两句话说清楚,因为答案不是一个靠谱或不靠谱可以回答好的,既然被反复问到,今天就系统地整理参考答案。


[- 11 -] 

[链接] 

[摘要] 本文在深入研究webrtc源代码的基础上,以video数据的发送和接收为例,力求用简洁语言描述rtp/rtcp模块的实现细节,为进一步深入掌握webrtc打下良好基础。


[- 12 -] 

[链接] 

[摘要] 本文着重阐述端到端加密(e2ee),端到端加密是确保数据传输安全的可行方法之一。读完这篇文章,你可以了解这种加密方式的基本原理.


[- 13 -] 

[链接] 

[摘要] 那么 rtc 技术栈究竟包含哪些技术,我们会提供一系列文章,来解读 rtc 技术栈。本文是系列文章的第一篇:讲述视频编解码的一些基本知识。


[- 14 -] 

[链接] 

[摘要] webrtc是提供了一整套处理实时音视频的开源库。它包括了音视频处理(采集,编解码,前处理,后处理,渲染),数据传输(实时传输,流控)和业务逻辑控制。可以说 webrtc 的出现大大减少了做音视频开发的难度,所以熟练掌握好这个库对于做音视频相关的同学就显的特别重要了。


[- 15 -] 

[链接] 

[摘要] 直到2011年,webrtc技术的出现,并且由谷歌做推广。webrtc带来的体验是因为免安装才受到了关注。


[- 16 -] 

[链接] 

[摘要] 有人说 2017 年是 webrtc 的转折之年,2018 年将是 webrtc 的爆发之年,这并非没有根据。就在去年(2017年),webrtc 1.0 标准草案出炉(实际上webrtc标准草案的早期版本早在2011年就已经发布,webrtc并非一夜之间就出现的技术),并将于今年正式发布。与此同时,越来越多的浏览器和厂商都开始对它进行广泛的支持,webrtc 即将成为互联网的基础设施了,或许门槛如此之高的实时音视频技术终有白菜化的那一天。


[- 17 -] 

[链接] 

[摘要] 本文来自腾讯视频云终端技术总监rexchang(常青)技术分享,内容分别介绍了微信小程序视音视频和webrtc的技术特征、差异等,并针对两者的技术差异分享和总结了微信小程序视音视频和webrtc互通的实现思路以及技术方案。希望能带给你启发。


[- 18 -] 

[链接] 

[摘要] 本文主要通过对webrtc接收端的音视频处理过程分析,来了解和优化视频首帧的显示时间,并进行了总结和分享。


[- 19 -]

[链接] 

[摘要] 本文将基于笔者公司开发的在线问诊产品中webrtc技术的实践经验,讲述的如何基于webrtc从零开发一个实时音视频聊天功能。文章会从webrtc的基本知识、技术原理开始,基于开源技术为你演示如何搭建一个webrtc实时音视频聊天功能。


[- 20 -] 

[链接] 

[摘要] webrtc(全称 web real-time communication),即网页即时通信。是一个支持网页浏览器进行实时语音对话或视频对话的技术方案。从前端技术开发的视角来看,是一组可调用的api标准。


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

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

posted @ 2023-11-24 11:39 jack jiang 阅读(53) | 评论 (0) |  

     摘要: 本文由b端技术中心分享,原题“从0到1:哔哩哔哩智能客服系统的设计与实现”,本文有修订和改动。1、引言本文将要分享的是哔哩哔哩从0到1自研智能客服im系统的技术实践过程,包括整体架构设计和主要核心功能的技术实现思路等,希望带给你启发。* 推荐阅读:《得物从0到1自研客服im系统的技术实践之路》。  技术交流:- 移动端im开发入门文章:《新手入门一篇就够...  阅读全文

posted @ 2023-11-23 11:53 jack jiang 阅读(68) | 评论 (0) |  

     摘要: 本文由微信客户端团队rhythm分享,原题“视频号直播:如何进一步降低功耗占用?”,本文有修订和改动。1、引言功耗优化一直是 app 性能优化中让人头疼的问题,尤其是在直播这种用户观看时长特别久的场景。怎样能在不影响主体验的前提下,进一步优化微信ios端视频号直播的功耗占用,本文给出了一个不太一样的答案。  技术交流:- 移动端im开发入门文章:《新手入...  

posted @ jack jiang 阅读(50) | |  

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

[- 1 -] 

[链接] 

[摘要] 本文将以理论联系实际的方式,详细讲解一套典型im的通信协议设计的方方面面。


[- 2 -] 

[链接] 

[摘要] 通信安全是互联网应用首要考虑的问题,有别于传统pc应用,随着移动互联网时代的到来,移动端的通信安全性要同时权衡:安全、性能、体验、数据流量等等方面,要实现一个完整而实用的通信安全凯发天生赢家一触即发官网的解决方案并非易事。本文将详细介绍基于tls 1.3的微信新一代通信安全协议mmtls。


[- 3 -] 

[链接] 

[摘要] openim是阿里巴巴推出的,集成于阿里百川项目中的移动端im开放服务。阿里百川是阿里巴巴集团无线开放平台,为移动开发者(涵盖移动创业者)提供快速搭建app、加速app商业化、提升用户体验的凯发天生赢家一触即发官网的解决方案。


[- 4 -]

[链接] 

[摘要] 本文着重阐述端到端加密(e2ee),端到端加密是确保数据传输安全的可行方法之一。读完这篇文章,你可以了解这种加密方式的基本原理.


[- 5 -] 

[链接] 

[摘要] 端到端加密允许数据在从源点到终点的传输过程中始终以密文形式存在。采用端到端加密(又称脱线加密或包加密)时消息在被传输时到达终点之前不进行解密,因为消息在整个传输过程中均受到保护,所以即使有节点被损坏也不会使消息泄露。


[- 6 -] 

[链接] 

[摘要] 本文将深入浅出为读者介绍跨站点 websocket 漏洞的原理、检测方法和修复方法,希望能帮助广大读者在实际工作中避免这个已知安全漏洞。


[- 7 -] 

[链接] 

[摘要] 本文将通过通俗易懂的文字,引导你一步步理解为何一个即时通讯应用需要加密技术,以及需要何种方式的加密技术等,希望能为您的im或消息推送服务的设计提供一些参考。


[- 8 -]  

[链接] 

[摘要] 本文讨论的使用http短连接的话题可能并不适用于微信这样的im,因为微信的短连接并非使用http标准协议实现,而是基于自研的mars网络层框架再造了一套短连接机制,从而更适用于im这种场景(更低延迟、更省流量、更好的弱网适应算法等)


[- 9 -] 

[链接] 

[摘要] 量子通信技术是个很高端的话题,对于搞im、推送、网络通信的程序员来说,这到底是个什么鬼?所以我们一起来了解一下!


[- 10 -] 

[链接] 

[摘要] 本文将尝试用通俗易懂的语言,一步步还原https的设计过程,以便您能轻松理解为什么https最终会是这副模样。


[- 11 -] 

[链接] 

[摘要] 本文只做简单的描述,力求简单明了的阐明主要内容,因为https 体系非常复杂,这么短的文字是无法做到很详细和精准的分析。想要详细了解https的方方面面,可以阅读此前即时通讯网整理的《即时通讯安全篇(七):如果这样来理解https,一篇就够了》一文。


[- 12 -] 

[链接] 

[摘要] https(全称:hypertext transfer protocol secure,超文本传输安全协议),是以安全为目标的http通道,简单讲是http的安全版。本文,就来深入介绍下其原理。


[- 13 -] 

[链接] 

[摘要] 本文正好借此机会,以netty编写的im聊天加密为例,为入门者理清什么是pki体系、什么是ssl、什么是openssl、以及各类证书和它们间的关系等,并在文末附上简短的netty代码实示例,希望能助你通俗易懂地快速理解这些知识和概念!


[- 14 -] 

[链接] 

[摘要] 本文要分享的是如何使用openssl生成在基于netty的im中真正可用的ssl/tls证书,内容包括:证书的创建、创建过程中的注意点,以及在server端、android端、ios端、java桌面端、h5端使用证书的代码范例。


[- 15 -] 

[链接] 

[摘要] 本文将介绍微信的安全数据特征仓库的背景起源、技术演进、当前的架构设计和实践,以及数据质量保证系统的实现。希望给中大型im系统的安全数据特征仓库的设计带来启发。


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

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

posted @ jack jiang 阅读(48) | |  

本文由小红书基础架构存储组空洞和刘备分享,原题“小红书如何应对万亿级社交网络关系挑战?图存储系统 redtao 来了!”,本文有修订和改动。

小红书是一个社区属性为主的产品,它涵盖了各个领域的生活社区,并存储海量的社交网络关系。

为了解决社交场景下超大规模数据的更新与关联读取问题,并减少数据库压力和成本,我们自研了面向超大规模社交网络的图存储系统 redtao,大大提高了系统稳定性。该系统借鉴了 facebook 的图存储系统设计,将缓存和底层数据库封装起来,并对外提供统一的图查询 api,实现了访问收敛,同时在缓存中实现了高效的边聚合。

本文将为你分享小红书面向超大规模社交网络的图存储系统redtao的架构设计与技术实践过程,希望能带给你启发。

 
 
技术交流:

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

- 开源im框架源码:()

(本文已同步发布于:)

空洞:小红书基础架构存储组,负责图存储系统 redtao 和分布式缓存的研发。

刘备:小红书基础架构存储组负责人,负责redkv / redtao / redtable / redgraph 的整体架构和技术演进。

基础架构存储组是给小红书的业务部门提供稳定可靠的存储和数据库服务,满足业务对存储产品的功能、性能、成本和稳定性要求。目前负责自研分布式 kv、分布式缓存、图存储系统、图数据库和表格存储。

已上线的存储产品包括:

  • 1)redkv : 分布式高性能 kv;
  • 2)redtao :满足一跳查询的高性能图存储数据库;
  • 3) redtable :提供 schema 语义和二级索引的表格存储;
  • 4) redgraph :提供两跳及以上的图语义查询数据库。

小红书是以年轻人为主的生活记录、分享平台,用户可以通过短视频、图文等形式记录生活点滴,分享生活方式。

在小红书的社交领域里,我们有用户、笔记、商品等实体,这些实体之间有各种各样的关系。

例如:用户与笔记之间可能存在“拥有”(发布)、“点赞”、“收藏”等三种关系,同时还存在对应的反向关系“被点赞”,“被收藏”等。

小红书的社交图谱数据已经达到了万亿条边的规模,且增长速度非常快。当用户登陆小红书时,每个用户都会看到关注的好友、粉丝、点赞、收藏以及其他为其量身定做的内容。

这些信息高度个性化,需要实时从这些海量社交关系数据中读取用户相关信息。这是一个读为主的过程,读取压力非常大。

过去,我们将这些社交图谱数据都存储在运维成熟的 mysql 数据库中。

然而,即使我们只有百万请求每秒的规模,mysql 的 cpu 使用率仍然到达了 55% 。随着用户和 dau 爆发式的增长,需要不断扩容 mysql 数据库,这带来了巨大的成本和稳定性压力。

为了解决这些问题且考虑到没有合适的开源方案,2021 年初我们开启了从 0 到 1 自研 redtao 的历程。

4.1方案调研

我们充分调研了业内其他厂商的实现,发现有着强社交属性的公司基本上都有一个自研的图存储系统(如下图所示)。

比如:

  • 1)facebook 实现了一个叫做 “tao” 专门的分布式社交图谱数据库,并将其作为最核心的存储系统;
  • 2)pinterest 和 facebook 类似,也实现了类似的图存储系统;
  • 3)字节跳动自研了 bytegraph 并将其用于存储核心的社交图谱数据;
  • 4)linkedln 在 kv 之上构建了社交图谱服务。

考虑到当时我们的社交图谱数据已经存放在 mysql 数据库上且规模巨大,而社交图谱数据服务是非常重要的服务,对稳定性的要求非常高。回溯 facebook 当年遇到的问题和我们类似,数据存储在 memcache 和 mysql 中。因此,参考 facebook 的 tao 图存储系统更贴合我们的实际情况和已有的技术架构,风险更小。

4.2api设计

社交图谱的访问主要是边的关系查询。

我们的图模型将关系表示为一个  对,其中 key 是 ( fromid,  assoctype,  toid ) 的三元组,value 是属性的  json 格式。

比如“用户 a ”关注“用户 b ”,映射到 redtao 的数据存储结构为:

1  ->  value (属性的json字段)

我们对业务方的需求进行分析,封装了 25 个图语义的 api 给业务方使用,满足了其增删改查的需求,并收敛业务方的使用方式。

相比于 facebook 的 tao,我们还补充了社交图谱所需要的图语义,为反作弊场景提供了额外的过滤参数。

同时,在缓存层面,我们支持对不同的字段在缓存中配置局部二级索引。

下面给一些典型的使用场景。

1)场景一:获取关注了 a 的所有正常用户(并且剔除作弊用户):

1getassocs(“被关注类型”, 用户a的id, 分页偏移量, 最大返回值, 只返回正常用户,是否按照时间从新到旧)

2)场景二:获取 a 的粉丝个数(并且剔除作弊用户):

1getassoccount(“被关注类型”, 用户a的id, 只返回正常用户)

redtao 的架构设计考虑了下面这几个关键的要素:

整体架构分为三层:

  • 1)接入层;
  • 2)缓存层;
  • 3)持久层。

业务方通过 redtao sdk 接入服务。

如下图:

在这个架构中:和 facebook tao 不一样的是,我们的缓存层是一个独立的分布式集群,和下面的持久层是解耦的。缓存层和下面的持久层可以独立的扩容缩容,缓存分片和 mysql 分片不需要一一对应,这样带来了更好的灵活性,mysql 集群也变成了一个可以插拔替换的持久存储。

1)读流程:客户端将读请求发送给 router,router 接收到 rpc 请求后,根据边类型选择对应的 redtao 集群,根据三元组 ( fromid,  assoctype,  toid ) 通过一致性 hash 计算出分片所在的 follower 节点,将请求转发到该节点上。follower 节点接收到该请求,首先查询本地的图缓存,如果命中则直接返回结果。如果没有命中,则将请求转发给 leader 节点。同样的,leader 节点如果命中则返回,如果不命中则查询底层 mysql 数据库。

2)写流程:客户端将写请求发送给 router,和读流程一样,会转发到对应的 follower 节点上。follower 节点会转发写请求给 leader 节点,leader 节点转发给 mysql,当 mysql 返回写入成功后,leader 会清除本地图缓存对应的 key,并同步给其他所有 follower 清除掉该 key,保证数据的最终一致性。

redtao 分为独立的两层:缓存层和持久层。每一层都保证高可用性。

1)自研的分布式缓存:

我们自研了实现图语义的分布式 cache 集群,支持故障自动检测和恢复、水平扩缩容。

它是一个双层 cache,每个分片都有一个 leader 和若干个 follower。所有的请求都先发给外层的 follower,再由 follower 转发给 leader。这样的好处是读压力大的时候只需要水平扩展 follower,单点 leader 写入的方式也降低了复杂度,更容易实现数据的一致性。

如果一个副本故障,系统会在秒级别内进行切换。当持久层发生故障时,分布式缓存层仍然可以对外提供读取服务。

2)高可用的mysql集群:

mysql 集群通过自研的中间件实现了分库分表方案,并支持 mysql 的水平扩容。每个 mysql 数据库有若干从库,并且与公司内部其他的 mysql 运维方案一致,保证高可用性。

3)限流保护功能:

为防止缓存击穿导致 mysql 突发大量请求,从而导致 mysql 宕机,我们通过限制每个主节点最大 mysql 并发请求数来实现限流保护 mysql。达到最大并发请求限制之后的请求会被挂起等待,直到已有请求被处理返回,或者达到等待超时请求被拒绝不会被继续请求到 mysql 。限流阈值在线可调,根据 mysql 集群规模调整对应限制。

为防止爬虫或者作弊用户频繁刷同一条数据,我们利用 redtaoqueue 顺序执行对写入或者点查同一条边的请求,队列长度会被限制,控制同一时间大量相同的请求执行。相比于单个全局的队列控制所有请求的方式,基于每个请求的队列可以很好地限制单个同一请求,而不影响其他正常请求。

数据结构的设计是 redtao 高性能的重要保证。

我们采用了三层嵌套 hashtable 的设计, 通过根据某个起点 from_id 从第一级 hashtable 中查找到 redtaograph,记录了所有 type 下对应的所有的出边信息。

接着,在第二级 hashtable 中,根据某个 type_id 查找到 assoctype 对应某个 type 下边所有出边的计数、索引以及其他元数据。

最终在最后一级 hashtable ,通过 assoctype 的某个 to_id 查找到最终边信息。

我们记录了创建时间、更新时间、版本、数据以及 redtaoqueue,time_index 则对应根据创建时间排序列表。

最后一级 hashtable 以及索引限制存储最新的 1000 个边信息,以限制超级点占据过多内存,同时集中提高最新热数据的查询命中率以及效率。redtaoqueue 用于排队当前某个关系的读写,只记录了当前最后一个请求的元数据。

每次查询或写入时,首先查询 redtaoassoc:

  • 1)若缓存不存在,则会首先创建只包含 redtaoqueue 的对象;
  • 2)若缓存已存在,则会更新队列元数据,将自己设置为队列的最后一个请求,并挂起等待被执行。

通过这种多层 hash 跳表的设计,我们能高效地组织点、边、索引、时间序链表之间的关系。内存的申请、释放在同一个线程上完成。

在线上环境中,我们的系统可以在一台 16 核的云厂商虚拟机上跑到 150w 查询请求/s,同时 cpu 利用率仅有 22.5% 。下方是线上集群的一个监控图,单机的 qps 到达 3w ,每个 rpc 请求聚合了 50 个查询。

 

1)丰富的图语义 api :

我们在 redtao 中封装了 25 个图语义的 api 给业务方使用,满足了业务方的增删改查的需求。业务方无需自行编写 sql 语句即可实现相应操作,使用方式更加简单和收敛。

2)统一的访问 url :

由于社区后端数据太大,我们按照不同的服务和优先级拆分成了几个 redtao 集群。

为了让业务方不感知后端的集群拆分逻辑,我们实现了统一的接入层。

不同的业务方只需使用同一个服务 url ,通过 sdk 将请求发送到接入层。接入层会接收到不同业务方的图语义的请求,并根据边的类型路由到不同的 redtao 集群。它通过订阅配置中心,能够实时感知到边的路由关系,从而实现统一的访问 url,方便业务方使用。

作为社交图谱数据,数据的一致性至关重要。我们需要严格保证数据的最终一致性以及一定场景下的强一致性。为此,我们采取了以下措施:

1)缓存更新冲突的解决:

redtao 为每个写入请求生成一个全局递增的唯一版本号。在使用 mysql 数据更新本地缓存时,需要比较版本号,如果版本号比缓存的数据版本低,则会拒绝此更新请求,以避免冲突。

2)写后读的一致性:

proxy 会将同一个 fromid 的点或边请求路由到同一个读 cache 节点上,以保证读取数据一致性。

3)主节点异常场景:

leader 节点收到更新请求后,会将更新请求变为 invalidate cache 请求异步的发送给其他 follower,以保证 follower 上的数据最终一致。在异常情况下,如果 leader 发送的队列已满导致 invalidate cache 请求丢失,那么会将其他的 follower cache 全部清除掉。

如果 leader 故障,新选举的 leader 也会通知其他 follower 将 cache 清除。

此外,leader 会对访问 mysql 的请求进行限流,从而保证即使个别分片的cache被清除掉也不会将 mysql 打崩。

4)少量强一致的请求:

由于 mysql 的从库也提供读服务,对于少量要求强一致的读请求,客户端可以将请求染上特殊标志,redtao 会透传该标志,数据库 proxy 层会根据该标志将读请求转发到 mysql 主库上,从而保证数据的强一致。

跨云多活是公司的重要战略,也是 redtao 支持的一个重要特性。

redtao 的跨云多活架构整体如下:

这里不同于 facebook tao 的跨云多活实现,facebook tao 的跨云多活实现如下图所示。

facebook 的方案依赖于底层的 mysql 的主从复制都通过 dts replication 来做。而 mysql 原生的主从复制是自身功能,dts 服务并不包含 mysql 的主从复制。该方案需要对 mysql 和 dts 做一定的改造。前面说到,我们的缓存和持久层是解藕的,在架构上不一样。

因此,redtao 的跨云多活架构是我们结合自身场景下的设计,它在不改动现有 mysql 功能的前提下实现了跨云多活功能。

1)持久层我们通过 mysql 原生的主从 binlog 同步将数据复制到其他云的从库上。其他云上的写请求和少量要求强一致读将被转发到主库上。正常的读请求将读取本区的 mysql 数据库,满足读请求对时延的要求。

2)缓存层的数据一致性是通过 mysql dts 订阅服务实现的,将 binlog 转换为 invalidate cache 请求,以清理掉本区 redtao cache 层的 stale 数据。由于读请求会随机读取本区的任何一个 mysql 数据库,因此 dts 订阅使用了一个延迟订阅的功能,保证从 binlog 同步最慢的节点中读取日志,避免 dts 的 invalidate cache 请求和本区 read cache miss 的请求发生冲突从而导致数据不一致。

redtao 的云原生特性重点体现在弹性伸缩、支持多 az 和 region 数据分布、产品可以实现在不同的云厂商间迁移等几个方面。redtao 在设计之初就考虑到支持弹性扩缩容、故障自动检测及恢复。

随着 kubernetes 云原生技术越来越成熟,我们也在思考如何利用 k8s 的能力将部署和虚拟机解绑,进一步云原生化,方便在不同的云厂商之间部署和迁移。

redtao 实现了一个运行在 kubernetes 集群上的 operator,以实现更快的部署、扩容和坏机替换。

为了让 k8s 能感知集群分片的分配并且控制同一分片下的 pods 调度在不同宿主机上,集群分组分片分配由 k8s operator 渲染并控制创建 duplicateset (小红书自研 k8s 资源对象)。

redtao 则会创建主从并根据 operator 渲染出来的分片信息创建集群,单个 pod 故障重启会重新加入集群,无需重新创建整个集群。集群升级时,operator 通过感知主从分配控制先从后主的顺序,按照分片分配的顺序滚动升级以减少升级期间线上影响。

但凡变革,皆属不易。实现全新的 redtao 只是完成了相对容易的那部分工作。

小红书的社交图谱数据服务已经在 mysql 上运行多年,有很多不同的业务跑在上面,任何小的问题都会影响到小红书的在线用户。因此,如何保证不停服的情况下让现有业务无感知地迁移到 redtao 上成为一个非常大的挑战。

我们的迁移工作关键有两点:

1)将老的大 mysql 集群按优先级拆分成了四个 redtao 集群。这样,我们可以先将优先级最低的服务迁移到一个 redtao 集群,充分灰度后再迁移高优先级的集群;

2)专门开发了一个 tao proxy sdk,支持对原来的 mysql 集群和 redtao 集群进行双写双读,数据校验比对。

迁移时:我们首先将低优先级的数据从 mysql 通过 dts 服务迁移到了一个 redtao 集群,并升级好业务方的 sdk 。dts 服务一直对增量数据进行同步。业务方 sdk 会订阅配置中心的配置变更,我们修改配置让 tao proxy sdk 同时读写 mysql 集群和 redtao 集群,并关闭 dts 服务。此时会使用 mysql 集群的结果返回给用户。

在停止 dts 服务时:有可能会有新的 mysql 数据通过 dts 同步过来,造成了 redtao 集群新写的数据被同步过来的老数据覆盖。因此,在关闭 dts 服务后,我们会通过工具读取开双写之后到关闭 dts 服务这个时间段的 binlog 对数据进行校验和修复。

修复完成之后:tao proxy sdk 的双读会展示两边不一致的数据量,并过滤掉因为双写时延不一致导致数据不一致的请求。灰度一段时间后观察到 diff 的数目基本为 0,将 tao proxy sdk 的配置改为只读写新的 redtao 集群。

最终:我们在 22 年初完成小红书所有核心社交图谱万亿边级别数据的迁移和正确性校验,并做到了整个迁移服务无感知,迁移过程没有发生一起故障。

我们的社交图谱数据访问中,90% 以上的请求都是读请求,并且社交图谱的数据有非常强的时间局部性(即最近更新的数据最容易被访问)。redtao 上线后,获得 90% 以上的 cache 命中率, 对mysql 的 qps 降低了 70% ,大大降低了 mysql 的 cpu 使用率。在缩容 mysql 的副本数目后,整体成本降低了21.3%。‍

业务的访问方式都全部收敛到 redtao 提供的 api 接口上,在迁移过程中,我们还治理了一些老的不合理访问 mysql 数据库的方式,以及自定义某些字段赋予特殊含义的不合理做法,通过 redtao 规范了数据访问。

对比 2022 年初和 2023 年初,随着 dau 的增长,社交图谱的请求增长了 250% 以上,如果是之前 mysql 的老架构,扩容资源基本上和请求增长速度成正比,至少需要扩容 1 倍的资源成本(数万核)。

而得益于 redtao 系统的存在,因其 90% 的缓存命中率,实际上整体成本只增加了 14.7%(数千核)就能扛下 2.5 倍的请求增长。在成本和稳定性上有了较大的提升。

在较短的时间,我们自研了图存储系统 redtao ,解决了社交图谱关系数据快速增长的问题。

redtao 借鉴了 facebook tao 的论文,并对整体架构、跨云多活做了较多的改进,全新实现了一个高性能的分布式图缓存,更加贴合我们自身的业务特点和提供了更好的弹性。同时,利用 k8s 能力进一步实现了云原生化。

随着 dau 的持续增长,万亿的数据规模也在继续增长,我们也面临着更多的技术挑战。

目前公司内部的 oltp 图场景主要分为三块:

1)社交图谱数据服务:通过自研图存储系统 redtao 满足了社交场景超大规模数据的更新与关联读取问题。目前已经存储了万亿规模的关系;

2)风控场景:通过自研图数据库 redgraph,满足多跳的实时在线查询。目前存储了千亿点和边的关系,满足 2 跳以及 2 跳以上的查询;

3)社交推荐:这块主要是两跳的查询。每天通过 hive 批量地导入全量的数据,通过 dts 服务近实时的写入更新数据。因为是在线场景,对时延的要求非常高,当前的 redgraph 还无法满足这么高的要求,因此业务方主要是用 redkv 来存储。

针对以上场景:为了快速满足业务需求,我们使用了三套不同的自研存储系统:redtao 、redgraph 和 redkv 。

显然相对于 3 套存储系统,用一个统一的架构和系统去解决这几个图相关的场景是更加合适的。

未来:我们会将 redgraph 和 redtao 融合成一个统一的数据库产品,打造业内顶尖的图技术,对公司内部更多的场景进行赋能。

[1] 

[2] 

[3] 

[4] 

[5] 

[6] 

[7] 

[8] 

[9] 

[10] 


(本文已同步发布于:)

posted @ 2023-11-09 11:21 jack jiang 阅读(73) | 评论 (0) |  

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