你所在的位置: 首页 > 正文

从游击队到正规军:马蜂窝旅游网的IM系统架构演进之路

2019-08-08 点击:1895 钢材新闻

  本文引用自马蜂窝公众号,由马蜂窝技术团队原创分享。

今天,越来越多的用户被马湾不断积累的高质量共享内容所吸引,如笔记,战术和谣言。这刺激了旅行的热情,也刺激了Ma-cellular交易的增长。 IM系统在帮助用户做出旅行决策和完成交易方面发挥着重要作用。

IM系统在用户和商家之间建立直接的通信渠道,帮助用户回答购买旅行产品时的问题,这不仅便于订单交易,而且还帮助用户消除疑虑并促进实现用户的旅行愿望。随着业务的快速发展,Macelline IM系统在过去几年中经历了几次重要的建筑演变和变革。

本文将从零开始分享Ma Cellular Travel Network的IM系统架构演变的整个过程,希望为您的IM技术选择和解决方案确定带来灵感。

关于Ma Cellular Travel Network:

Ma Cellular Travel Network是中国领先的免费旅游服务平台。它由陈浩和陆刚于2006年创立,并于2010年正式开始营业.Ma Honeycomb的景点,餐厅,酒店和其他评论来自数亿用户的真正共享,每个用户数以千万计一年制定免费旅行计划。

学会沟通:

- 即时消息/推送技术开发交换4组:[推荐]

- 移动IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》

(本文同时发表于:

《一套海量在线用户的移动端IM架构设计实践分享(含详细图文)》

《一套原创分布式即时通讯(IM)系统理论架构方案》

《从零到卓越:京东客服即时通讯系统的技术架构演进历程》

《蘑菇街即时通讯/IM服务器开发之架构选择》

《以微博类应用场景为例,总结海量社交系统的架构设计步骤》

《一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践》

《腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT》

《微信技术总监谈架构:微信之道大道至简(演讲全文)》

《如何解读《微信技术总监谈架构:微信之道大道至简》“

《快速裂变:见证微信强大后台架构从0到1的演进历程(一)》

在初始阶段,为了支持业务的快速启动,并且当前版本的流量较低,对并发性的要求并不高。 IM系统的技术架构主要是简单易用,实现的功能也很基础。

IM1.0是使用PHP开发的,实现了IM基本用户/客户访问,消息传递和咨询列表管理功能。当用户咨询时,将平均分配的策略分配给客户服务,并记录用户和客户服务之间的关系。当用户/客户发送消息时,通过调用消息转发模块将消息转发到另一方的Redis阻塞队列。消息通过HTTP长连接发送到消息轮询模块。它会在有消息时立即返回。如果没有消息,它将阻塞一段时间。这里阻塞的目的是减少轮询间隔。

消息传递模型如下所示:

上图中消息轮询模块的长连接请求通过php-fpm安装在阻塞队列中。当请求变得太多时,如果php-fpm进程无法及时发布,服务器性能会很高,负载会很高。

为了解决这个问题,我们优化了消息轮询模块,并选择了OpenResty框架,通过使用Lua协程来优化php-fmp长期安装问题。 Lua协程将判断是否通过Nginx转发的请求标记拦截网络请求。如果被截获,阻塞操作将被移交给Lua协程进行处理,并且php-fmp将及时发布以减轻服务器的消耗。

优化的处理流程如下图所示:

随着业务的快速增长,IM系统在短期内面临着大量的定制需求,并且已经开发了许多新的业务模块。面对大量的用户咨询,客户服务的服务能力已无法站起来。

因此,IM2.0将专注于改善业务功能体验,例如:

1)在处理用户咨询时,它将从单一的分配方法演变为各种方法,如平均,加权和排队;

2)为了提高客户服务的效率,客户服务的咨询响应还增加了可选配置,如自动回复,常见问题解答等。

以典型的用户咨询场景为例,当用户打开App的可重用且可检索的消息行时;当消息发送时,消息通过消息服务存储在DB中,并根据消息行检索当前的咨询。客户服务,呼叫分配服务的目的是改善当前咨询的客户服务信息;最后将客户服务信息更新为链接关系。

建立完整的消息链接,并将用户/客户服务发送的消息通过转发服务发送给另一方。

上述过程如下图所示:

5.1,概述

业务量不断累积,随着模块的增加,IM系统的代码迅速扩展。由于缺乏统一的代码规范,单一的接口职责以及模块之间的更多耦合,更改一个需求可能会影响其他模块,从而使新需求的开发和维护成本很高。

为了解决这种情况,必须升级IM系统。第一项任务是拆分服务。目前,拆分IM系统分为四大服务,包括客户服务,用户服务,IM服务和数据服务。

如下图所示:

如上所示,我们来看看它:

1)客户服务:提供多种方式来提高客户服务效率和用户体验,如提供集团管理,会员管理,质量检测服务等,以提高客户服务团队的运营和管理水平;通过为用户分配服务和转移服务接收效率更加灵活和高效;支持自动回复,常见问题解答,知识库服务等,提高客户服务咨询效率等;

2)用户服务:分析用户行为,为用户提供兴趣推荐和用户肖像,并计算用户对Macelle商家服务的满意度;

3)IM服务:支持单聊和群聊模式,提供实时消息通知,离线消息推送,历史消息漫游,联系人,文件上传和存储,消息内容风险控制检测等;

4)数据服务:通过收集用户咨询的源门户,是否咨询订单,是否有客户服务接收,用户咨询和客户服务回复的时间信息来定义数据指标,并通过数据分析进行离线数据计算,最后提供外部数据统计。信息。主要指标包括30秒,1分钟响应率,咨询次数,无响应时间,平均响应时间,咨询销售,咨询转换率,建议转换率,分时接收压力,工作状态,服务等级等。/p>

5.2,用户状态流

在现有的IM系统中,用户咨询期间的完整用户状态流程如下图所示:

如上图所示:

1)用户点击咨询按钮触发事件,用户状态进入初始状态;

2)当发送消息时,系统改变要分配的用户状态,并且在通过呼叫分发服务分配相应的客户服务之后,用户状态变为已分配和未解决;

3)当客户服务解决用户或客户服务回复时,用户长时间不说话,触发系统自动解决的操作。此时,用户状态变为已解决,并且咨询过程结束。

5.3。重建IM服务

在服务拆分过程中,我们需要考虑特定服务的多功能性,可用性和降级策略,同时最小化服务之间的依赖关系,并避免由于单个服务不可用而导致整体服务失败的风险。

在此期间,公司的其他业务线对IM服务的使用有越来越多的需求,使用的频率和幅度也开始增加。在IM服务的初始阶段,当连接量很大时,只能通过修改代码来实现水平扩展;当访问新服务时,需要在服务服务器上配置Openresty环境和Lua协程代码,并且服务访问非常不方便,并且IM服务是多功能性也很差。

考虑到上述问题,我们完全重构了IM服务。目标是将IM服务提取到独立模块中,并提供统一的集成和调用方法,而不依赖于其他服务。考虑到IM服务的高处理和低损耗要求,选择Go语言来开发此模块。

新的IM服务设计如下:

其中,更重要的代理层和Exchange层提供以下服务:

1)路由规则:如ip-hash,轮询,最小连接数等,客户端按规则散列到不同的ChannelManager实例;

2)客户端访问管理:连接的连接信息将同步到DispatchTable模块,以便Dispatcher检索;

3)ChannelManager与客户端之间的通信协议:包括建立连接的客户端请求,断开重连,主动断开,心跳,通知,发送和接收消息,消息QoS等;

4)用于在外部提供单一发布和组发送消息的REST接口:有必要根据场景决定是否使用。例如,如果用户咨询客户服务,则需要通过此界面发送消息。

对于上述“4)”点,主要原因有以下三点:

1)当发送消息时,将存在用于创建消息行,分配管家等的逻辑。这些逻辑当前在PHP中实现。 IM服务需要知道PHP的执行结果。一种方法是使用Go重新实现,另一种方法是通过REST接口调用。 PHP返回,这将带来IM服务和PHP业务之间过多的网络交互,影响性能;

2)转发消息时,ChannelManager的多个实例需要相互通信。例如,ChannelManager1上的用户A在ChannelManager2上向客户服务B发送消息。如果实例之间没有通信机制,则无法转发消息。当要扩展ChannelManager实例时,新实例需要与其他现有实例建立通信,这增加了系统扩展的复杂性;

3)如果客户端不支持WebSocket协议,则HTTP长连接循环作为降级方案只能用于接收消息,并且消息需要通过短连接进行处理。其他方案不需要邮件转发。仅用于向ChannelManager传输消息的场景可以通过WebSocket直接发送。

5.4。修改后的IM服务调用过程

初始化消息行并分配客户服务进程由PHP服务完成。当需要消息转发时,PHP服务将调用Dispatcher服务的消息传递接口。 Dispatcher服务通过共享的DispatcherTable数据检索接收者所在的ChannelManager实例,并通过RPC将消息发送到实例。 ChannelManager通过WebSocket推送消息。客户。

IM服务呼叫流程如下所示:

当连接数超过当前ChannelManager集群的上限时,只需要扩展ChannelManager实例,ETCD动态通知监控端实现平滑扩展。目前,已经开发了JS-SDK的浏览器版本,其他服务线可以通过访问文档轻松集成IM服务。

在Exchange层的设计中,有3个问题需要测试。

1)多端消息同步:

现在客户端有PC浏览器,Windows客户端,H5,iOS/Android。如果用户登录到多端,当有消息过来时,有必要找出用户的所有连接。当用户的某一端断开连接时,需要定位此连接。

如上所述,连接信息存储在DispatcherTable模块中,因此DispatcherTable模块应该能够根据用户信息快速检索连接信息。 DispatcherTable模块旨在使用Redis的Hash存储。当客户端与ChannelManager建立连接时,要同步的元数据具有uid(用户信息),uniquefield(唯一值,对应于连接的唯一值),wsid(连接标识符)),clientip(客户端ip),serverip(服务器ip),通道(channel),对应的结构大致如下:

通过这种方式,密钥(uid)可用于在用户的多个端点之间找到连接,并通过密钥+字段连接。连接信息的默认到期时间为2小时。目的是防止服务器因客户端连接的异常中断而被捕获,从而在DispatcherTable中存储一些过期数据。

2)用户在线状态同步:

例如,如果用户咨询了4个客户服务,则该用户将出现在4个客户服务的咨询列表中。当用户上线时,请确保四个客户服务用户看到用户在线。

有两种方法可以做到这一点:

一个是客户服务通过轮询获得用户的状态,但是当用户的在线状态没有改变时,会启动许多无效请求;

另一种是当用户上线时,客户服务推送在线通知,这将导致消息传播。咨询过的每个客户服务都需要通知。

最后,我们采取了第二种方式。在推送过程中,我们只将用户状态推送到在线客服。

3)消息不会丢失,不会重复:

为了避免消息丢失,对于长连接轮询方法,我们将在启动请求时带来客户端读取消息的ID,服务器将计算差异消息然后返回;当使用WebSocket方法时,服务器将在推送客户端消息后,等待客户端的ACK,如果客户端没有ACK,服务器将尝试多次推送。

此时,客户端需要根据消息ID执行消息的重复处理,以便客户端可能已经接收到消息,但是ACK确认由于其他原因而失败,触发重试,并且消息被重复。

5.5。 IM服务的消息流

如上所述,IM服务需要支持多个终端,同时,它在角色中被划分为用户侧和商家侧。为了使通知和消息在输出时根据域名,终端和角色动态输出差异化内容,引入DDD。 (域驱动设计)建模方法来处理消息。

流程如下所示:

随着Ma Cell“内容+交易”模式的不断深入,IM系统架构也经历了不同的演进和升级阶段,从最初的粗糙和无序模式到统一管理,逐步规范和形成规模。

我们取得了一些进展,当然,还有很长的路要走。在未来,结合公司业务的发展和团队的技术能力,我们将继续优化IM系统。

目前我们正计划用Go替换消息轮询模块中的服务器代码,这样它就不依赖于PHP和OpenResty环境来实现更好的解耦;此外,我们将探索基于TensorFlow的智能客户服务,通过培训数据模型和分析数据,进一步提高手动客户服务的效率,增强用户体验,更好地为企业提供支持。

[1]关于IM架构设计的文章:

《浅谈IM系统的架构设计》

《简述移动端IM开发的那些坑:架构设计、通信协议和客户端》

《一套海量在线用户的移动端IM架构设计实践分享(含详细图文)》

《一套原创分布式即时通讯(IM)系统理论架构方案》

《从零到卓越:京东客服即时通讯系统的技术架构演进历程》

《蘑菇街即时通讯/IM服务器开发之架构选择》

《腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT》

《微信后台基于时间序的海量数据冷热分级架构设计实践》

《微信技术总监谈架构:微信之道大道至简(演讲全文)》

《如何解读《微信技术总监谈架构:微信之道大道至简》“

《快速裂变:见证微信强大后台架构从0到1的演进历程(一)》

《17年的实践:腾讯海量产品的技术方法论》

《移动端IM中大规模群消息的推送如何保证效率、实时性?》

《现代IM系统中聊天消息的同步和存储方案探讨》

《IM开发基础知识补课(二):如何设计大量图片文件的服务端存储架构?》

《IM开发基础知识补课(三):快速理解服务端数据库读写分离原理及实践建议》

《IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token》

《WhatsApp技术实践分享:32人工程团队创造的技术神话》

《微信朋友圈千亿访问量背后的技术挑战和实践总结》

《王者荣耀2亿用户量的背后:产品定位、技术架构、网络方案等》

《IM系统的MQ消息中间件选型:Kafka还是RabbitMQ?》

《腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面》

《以微博类应用场景为例,总结海量社交系统的架构设计步骤》

《快速理解高性能HTTP服务端的负载均衡技术原理》

《子弹短信光鲜的背后:网易云信首席架构师分享亿级IM平台的技术实践》

《知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路》

《IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列》

《微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)》

《微信技术分享:微信的海量IM聊天消息序列号生成实践(容灾方案篇)》

《新手入门:零基础理解大型分布式架构的演进历史、技术原理、最佳实践》

《一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践》

《阿里技术分享:深度揭秘阿里数据库技术方案的10年变迁史》

《阿里技术分享:阿里自研金融级数据库OceanBase的艰辛成长之路》

《社交软件红包技术解密(一):全面解密QQ红包技术方案架构、技术实现等》

《社交软件红包技术解密(二):解密微信摇一摇红包从0到1的技术演进》

《社交软件红包技术解密(三):微信摇一摇红包雨背后的技术细节》

《社交软件红包技术解密(四):微信红包系统是如何应对高并发的》

《社交软件红包技术解密(五):微信红包系统是如何实现高可用性的》

《社交软件红包技术解密(六):微信红包系统的存储层架构演进实践》

《社交软件红包技术解密(七):支付宝红包的海量高并发技术实践》

《社交软件红包技术解密(八):全面解密微博红包技术方案》

《社交软件红包技术解密(九):谈谈手Q红包的功能逻辑、容灾、运维、架构等》

《即时通讯新手入门:一文读懂什么是Nginx?它能否实现IM的负载均衡?》

《即时通讯新手入门:快速理解RPC技术基本概念、原理和用途》

《多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了》

《从游击队到正规军:马蜂窝旅游网的IM系统架构演进之路》

>>更多类似的文章.

[2]更多相关的架构设计相关文章:

《腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面》

《快速理解高性能HTTP服务端的负载均衡技术原理》

《子弹短信光鲜的背后:网易云信首席架构师分享亿级IM平台的技术实践》

《知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路》

《新手入门:零基础理解大型分布式架构的演进历史、技术原理、最佳实践》

《阿里技术分享:深度揭秘阿里数据库技术方案的10年变迁史》

《阿里技术分享:阿里自研金融级数据库OceanBase的艰辛成长之路》

《达达O2O后台架构演进实践:从0到4000高并发请求背后的努力》

《优秀后端架构师必会知识:史上最全MySQL大表优化方案总结》

《小米技术分享:解密小米抢购系统千万高并发架构的演进和实践》

《一篇读懂分布式架构下的负载均衡技术:分类、原理、算法、常见方案等》

《通俗易懂:如何设计能支撑百万并发的数据库架构?》

《多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了》

《从新手到架构师,一篇就够:从100到1000万高并发的架构演进之路》

>>更多类似的文章.

(本文同时发表于:

96

JackJiang2011

0.2

2019.07.2421: 27

字数6224

本文引用了Macellis公共号码,最初由Macello技术团队共享。

今天,越来越多的用户被马湾不断积累的高质量共享内容所吸引,如笔记,战术和谣言。这刺激了旅行的热情,也刺激了Ma-cellular交易的增长。 IM系统在帮助用户做出旅行决策和完成交易方面发挥着重要作用。

IM系统在用户和商家之间建立直接的通信渠道,帮助用户回答购买旅行产品时的问题,这不仅有利于订单交易,还有助于用户消除疑虑并促进实现用户的旅行愿望。随着业务的快速发展,Macelline IM系统在过去几年中经历了几次重要的建筑演变和变革。

本文将从零开始分享Ma Cellular Travel Network的IM系统架构演变的整个过程,希望为您的IM技术选择和解决方案确定带来灵感。

关于Ma Cellular Travel Network:

Ma Cellular Travel Network是中国领先的免费旅游服务平台。它由陈浩和陆刚于2006年创立,并于2010年正式开始营业.Ma Honeycomb的景点,餐厅,酒店和其他评论来自数亿用户的真正共享,每个用户数以千万计一年制定免费旅行计划。

学会沟通:

- 即时消息/推送技术开发交换4组:[推荐]

- 移动IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》

(本文同时发表于:

《一套海量在线用户的移动端IM架构设计实践分享(含详细图文)》

《一套原创分布式即时通讯(IM)系统理论架构方案》

《从零到卓越:京东客服即时通讯系统的技术架构演进历程》

《蘑菇街即时通讯/IM服务器开发之架构选择》

《以微博类应用场景为例,总结海量社交系统的架构设计步骤》

《一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践》

《腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT》

《微信技术总监谈架构:微信之道大道至简(演讲全文)》

《如何解读《微信技术总监谈架构:微信之道大道至简》“

《快速裂变:见证微信强大后台架构从0到1的演进历程(一)》

在初始阶段,为了支持业务的快速启动,并且当前版本的流量较低,对并发性的要求并不高。 IM系统的技术架构主要是简单易用,实现的功能也很基础。

IM1.0是使用PHP开发的,实现了IM基本用户/客户访问,消息传递和咨询列表管理功能。当用户咨询时,将平均分配的策略分配给客户服务,并记录用户和客户服务之间的关系。当用户/客户发送消息时,通过调用消息转发模块将消息转发到另一方的Redis阻塞队列。消息通过HTTP长连接发送到消息轮询模块。它会在有消息时立即返回。如果没有消息,它将阻塞一段时间。这里阻塞的目的是减少轮询间隔。

消息传递模型如下所示:

上图中消息轮询模块的长连接请求通过php-fpm安装在阻塞队列中。当请求变得太多时,如果php-fpm进程无法及时发布,服务器性能会很高,负载会很高。

为了解决这个问题,我们优化了消息轮询模块,并选择了OpenResty框架,通过使用Lua协程来优化php-fmp长期安装问题。 Lua协程将判断是否通过Nginx转发的请求标记拦截网络请求。如果被截获,阻塞操作将被移交给Lua协程进行处理,并且php-fmp将及时发布以减轻服务器的消耗。

优化的处理流程如下图所示:

随着业务的快速增长,IM系统在短期内面临着大量的定制需求,并且已经开发了许多新的业务模块。面对大量的用户咨询,客户服务的服务能力已无法站起来。

因此,IM2.0将专注于改善业务功能体验,例如:

1)在处理用户咨询时,它将从单一的分配方法演变为各种方法,如平均,加权和排队;

2)为了提高客户服务的效率,客户服务的咨询响应还增加了可选配置,如自动回复,常见问题解答等。

以典型的用户咨询场景为例,当用户打开App的可重用且可检索的消息行时;当消息发送时,消息通过消息服务存储在DB中,并根据消息行检索当前的咨询。客户服务,呼叫分配服务的目的是改善当前咨询的客户服务信息;最后将客户服务信息更新为链接关系。

建立完整的消息链接,并将用户/客户服务发送的消息通过转发服务发送给另一方。

上述过程如下图所示:

5.1,概述

业务量不断累积,随着模块的增加,IM系统的代码迅速扩展。由于缺乏统一的代码规范,单一的接口职责以及模块之间的更多耦合,更改一个需求可能会影响其他模块,从而使新需求的开发和维护成本很高。

为了解决这种情况,必须升级IM系统。第一项任务是拆分服务。目前,拆分IM系统分为四大服务,包括客户服务,用户服务,IM服务和数据服务。

如下图所示:

如上所示,我们来看看它:

1)客户服务:提供多种方式来提高客户服务效率和用户体验,如提供集团管理,会员管理,质量检测服务等,以提高客户服务团队的运营和管理水平;通过为用户分配服务和转移服务接收效率更加灵活和高效;支持自动回复,常见问题解答,知识库服务等,提高客户服务咨询效率等;

2)用户服务:分析用户行为,为用户提供兴趣推荐和用户肖像,并计算用户对Macelle商家服务的满意度;

3)IM服务:支持单聊和群聊模式,提供实时消息通知,离线消息推送,历史消息漫游,联系人,文件上传和存储,消息内容风险控制检测等;

4)数据服务:通过收集用户咨询的源门户,是否咨询订单,是否有客户服务接收,用户咨询和客户服务回复的时间信息来定义数据指标,并通过数据分析进行离线数据计算,最后提供外部数据统计。信息。主要指标包括30秒,1分钟响应率,咨询次数,无响应时间,平均响应时间,咨询销售,咨询转换率,建议转换率,分时接收压力,工作状态,服务等级等。/p>

5.2,用户状态流

在现有的IM系统中,用户咨询期间的完整用户状态流程如下图所示:

如上图所示:

1)用户点击咨询按钮触发事件,用户状态进入初始状态;

2)当发送消息时,系统改变要分配的用户状态,并且在通过呼叫分发服务分配相应的客户服务之后,用户状态变为已分配和未解决;

3)当客户服务解决用户或客户服务回复时,用户长时间不说话,触发系统自动解决的操作。此时,用户状态变为已解决,并且咨询过程结束。

5.3。重建IM服务

在服务拆分过程中,我们需要考虑特定服务的多功能性,可用性和降级策略,同时最小化服务之间的依赖关系,并避免由于单个服务不可用而导致整体服务失败的风险。

在此期间,公司的其他业务线对IM服务的使用有越来越多的需求,使用的频率和幅度也开始增加。在IM服务的初始阶段,当连接量很大时,只能通过修改代码来实现水平扩展;当访问新服务时,需要在服务服务器上配置Openresty环境和Lua协程代码,并且服务访问非常不方便,并且IM服务是多功能性也很差。

考虑到上述问题,我们完全重构了IM服务。目标是将IM服务提取到独立模块中,并提供统一的集成和调用方法,而不依赖于其他服务。考虑到IM服务的高处理和低损耗要求,选择Go语言来开发此模块。

新的IM服务设计如下:

其中,更重要的代理层和Exchange层提供以下服务:

1)路由规则:如ip-hash,轮询,最小连接数等,客户端按规则散列到不同的ChannelManager实例;

2)客户端访问管理:连接的连接信息将同步到DispatchTable模块,以便Dispatcher检索;

3)ChannelManager与客户端之间的通信协议:包括建立连接的客户端请求,断开重连,主动断开,心跳,通知,发送和接收消息,消息QoS等;

4)用于在外部提供单一发布和组发送消息的REST接口:有必要根据场景决定是否使用。例如,如果用户咨询客户服务,则需要通过此界面发送消息。

对于上述“4)”点,主要原因有以下三点:

1)当发送消息时,将存在用于创建消息行,分配管家等的逻辑。这些逻辑当前在PHP中实现。 IM服务需要知道PHP的执行结果。一种方法是使用Go重新实现,另一种方法是通过REST接口调用。 PHP返回,这将带来IM服务和PHP业务之间过多的网络交互,影响性能;

2)转发消息时,ChannelManager的多个实例需要相互通信。例如,ChannelManager1上的用户A在ChannelManager2上向客户服务B发送消息。如果实例之间没有通信机制,则无法转发消息。当要扩展ChannelManager实例时,新实例需要与其他现有实例建立通信,这增加了系统扩展的复杂性;

3)如果客户端不支持WebSocket协议,则HTTP长连接循环作为降级方案只能用于接收消息,并且消息需要通过短连接进行处理。其他方案不需要邮件转发。只有通过WebSocket才能直接向ChannelManager发送消息。

5.4。修改后的IM服务调用过程

初始化消息行并分配客户服务进程由PHP服务完成。当需要消息转发时,PHP服务将调用Dispatcher服务的消息传递接口。 Dispatcher服务通过共享的DispatcherTable数据检索接收者所在的ChannelManager实例,并通过RPC将消息发送到实例。 ChannelManager通过WebSocket推送消息。客户。

IM服务呼叫流程如下所示:

当连接数超过当前ChannelManager集群的上限时,只需要扩展ChannelManager实例,ETCD动态通知监控端实现平滑扩展。目前,已经开发了JS-SDK的浏览器版本,其他服务线可以通过访问文档轻松集成IM服务。

在Exchange层的设计中,有3个问题需要测试。

1)多端消息同步:

现在客户端有PC浏览器,Windows客户端,H5,iOS/Android。如果用户登录到多端,当有消息过来时,有必要找出用户的所有连接。当用户的某一端断开连接时,需要定位此连接。

如上所述,连接信息存储在DispatcherTable模块中,因此DispatcherTable模块应该能够根据用户信息快速检索连接信息。 DispatcherTable模块旨在使用Redis的Hash存储。当客户端与ChannelManager建立连接时,要同步的元数据具有uid(用户信息),uniquefield(唯一值,对应于连接的唯一值),wsid(连接标识符)),clientip(客户端ip),serverip(服务器ip),通道(channel),对应的结构大致如下:

通过这种方式,密钥(uid)可用于在用户的多个端点之间找到连接,并通过密钥+字段连接。连接信息的默认到期时间为2小时。目的是防止服务器因客户端连接的异常中断而被捕获,从而在DispatcherTable中存储一些过期数据。

2)用户在线状态同步:

例如,如果用户咨询了4个客户服务,则该用户将出现在4个客户服务的咨询列表中。当用户上线时,请确保四个客户服务用户看到用户在线。

有两种方法可以做到这一点:

一个是客户服务通过轮询获得用户的状态,但是当用户的在线状态没有改变时,会启动许多无效请求;

另一种是当用户上线时,客户服务推送在线通知,这将导致消息传播。咨询过的每个客户服务都需要通知。

最后,我们采取了第二种方式。在推送过程中,我们只将用户状态推送到在线客服。

3)消息不会丢失,不会重复:

为了避免消息丢失,对于长连接轮询方法,我们将在启动请求时带来客户端读取消息的ID,服务器将计算差异消息然后返回;当使用WebSocket方法时,服务器将在推送客户端消息后,等待客户端的ACK,如果客户端没有ACK,服务器将尝试多次推送。

此时,客户端需要根据消息ID执行消息的重复处理,以便客户端可能已经接收到消息,但是ACK确认由于其他原因而失败,触发重试,并且消息被重复。

5.5。 IM服务的消息流

如上所述,IM服务需要支持多个终端,同时,它在角色中被划分为用户侧和商家侧。为了使通知和消息在输出时根据域名,终端和角色动态输出差异化内容,引入DDD。 (域驱动设计)建模方法来处理消息。

流程如下所示:

随着Ma Cell“内容+交易”模式的不断深入,IM系统架构也经历了不同的演进和升级阶段,从最初的粗糙和无序模式到统一管理,逐步规范和形成规模。

我们取得了一些进展,当然,还有很长的路要走。在未来,结合公司业务的发展和团队的技术能力,我们将继续优化IM系统。

目前我们正计划用Go替换消息轮询模块中的服务器代码,这样它就不依赖于PHP和OpenResty环境来实现更好的解耦;此外,我们将探索基于TensorFlow的智能客户服务,通过培训数据模型和分析数据,进一步提高手动客户服务的效率,增强用户体验,更好地为企业提供支持。

[1]关于IM架构设计的文章:

《浅谈IM系统的架构设计》

《简述移动端IM开发的那些坑:架构设计、通信协议和客户端》

《一套海量在线用户的移动端IM架构设计实践分享(含详细图文)》

《一套原创分布式即时通讯(IM)系统理论架构方案》

《从零到卓越:京东客服即时通讯系统的技术架构演进历程》

《蘑菇街即时通讯/IM服务器开发之架构选择》

《腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT》

《微信后台基于时间序的海量数据冷热分级架构设计实践》

《微信技术总监谈架构:微信之道大道至简(演讲全文)》

《如何解读《微信技术总监谈架构:微信之道大道至简》“

《快速裂变:见证微信强大后台架构从0到1的演进历程(一)》

《17年的实践:腾讯海量产品的技术方法论》

《移动端IM中大规模群消息的推送如何保证效率、实时性?》

《现代IM系统中聊天消息的同步和存储方案探讨》

《IM开发基础知识补课(二):如何设计大量图片文件的服务端存储架构?》

《IM开发基础知识补课(三):快速理解服务端数据库读写分离原理及实践建议》

《IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token》

《WhatsApp技术实践分享:32人工程团队创造的技术神话》

《微信朋友圈千亿访问量背后的技术挑战和实践总结》

《王者荣耀2亿用户量的背后:产品定位、技术架构、网络方案等》

《IM系统的MQ消息中间件选型:Kafka还是RabbitMQ?》

《腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面》

《以微博类应用场景为例,总结海量社交系统的架构设计步骤》

《快速理解高性能HTTP服务端的负载均衡技术原理》

《子弹短信光鲜的背后:网易云信首席架构师分享亿级IM平台的技术实践》

《知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路》

《IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列》

《微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)》

《微信技术分享:微信的海量IM聊天消息序列号生成实践(容灾方案篇)》

《新手入门:零基础理解大型分布式架构的演进历史、技术原理、最佳实践》

《一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践》

《阿里技术分享:深度揭秘阿里数据库技术方案的10年变迁史》

《阿里技术分享:阿里自研金融级数据库OceanBase的艰辛成长之路》

《社交软件红包技术解密(一):全面解密QQ红包技术方案架构、技术实现等》

《社交软件红包技术解密(二):解密微信摇一摇红包从0到1的技术演进》

《社交软件红包技术解密(三):微信摇一摇红包雨背后的技术细节》

《社交软件红包技术解密(四):微信红包系统是如何应对高并发的》

《社交软件红包技术解密(五):微信红包系统是如何实现高可用性的》

《社交软件红包技术解密(六):微信红包系统的存储层架构演进实践》

《社交软件红包技术解密(七):支付宝红包的海量高并发技术实践》

《社交软件红包技术解密(八):全面解密微博红包技术方案》

《社交软件红包技术解密(九):谈谈手Q红包的功能逻辑、容灾、运维、架构等》

《即时通讯新手入门:一文读懂什么是Nginx?它能否实现IM的负载均衡?》

《即时通讯新手入门:快速理解RPC技术基本概念、原理和用途》

《多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了》

《从游击队到正规军:马蜂窝旅游网的IM系统架构演进之路》

>>更多类似的文章.

[2]更多相关的架构设计相关文章:

《腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面》

《快速理解高性能HTTP服务端的负载均衡技术原理》

《子弹短信光鲜的背后:网易云信首席架构师分享亿级IM平台的技术实践》

《知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路》

《新手入门:零基础理解大型分布式架构的演进历史、技术原理、最佳实践》

《阿里技术分享:深度揭秘阿里数据库技术方案的10年变迁史》

《阿里技术分享:阿里自研金融级数据库OceanBase的艰辛成长之路》

《达达O2O后台架构演进实践:从0到4000高并发请求背后的努力》

《优秀后端架构师必会知识:史上最全MySQL大表优化方案总结》

《小米技术分享:解密小米抢购系统千万高并发架构的演进和实践》

《一篇读懂分布式架构下的负载均衡技术:分类、原理、算法、常见方案等》

《通俗易懂:如何设计能支撑百万并发的数据库架构?》

《多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了》

《从新手到架构师,一篇就够:从100到1000万高并发的架构演进之路》

>>更多类似的文章.

(本文同时发表于:

本文引用了Macellis公共号码,最初由Macello技术团队共享。

今天,越来越多的用户被马湾不断积累的高质量共享内容所吸引,如笔记,战术和谣言。这刺激了旅行的热情,也刺激了Ma-cellular交易的增长。 IM系统在帮助用户做出旅行决策和完成交易方面发挥着重要作用。

IM系统在用户和商家之间建立直接的通信渠道,帮助用户回答购买旅行产品时的问题,这不仅有利于订单交易,还有助于用户消除疑虑并促进实现用户的旅行愿望。随着业务的快速发展,Macelline IM系统在过去几年中经历了几次重要的建筑演变和变革。

本文将从零开始分享Ma Cellular Travel Network的IM系统架构演变的整个过程,希望为您的IM技术选择和解决方案确定带来灵感。

关于Ma Cellular Travel Network:

Ma Cellular Travel Network是中国领先的免费旅游服务平台。它由陈浩和陆刚于2006年创立,并于2010年正式开始营业.Ma Honeycomb的景点,餐厅,酒店和其他评论来自数亿用户的真正共享,每个用户数以千万计一年制定免费旅行计划。

学会沟通:

- 即时消息/推送技术开发交换4组:[推荐]

- 移动IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》

(本文同时发表于:

《一套海量在线用户的移动端IM架构设计实践分享(含详细图文)》

《一套原创分布式即时通讯(IM)系统理论架构方案》

《从零到卓越:京东客服即时通讯系统的技术架构演进历程》

《蘑菇街即时通讯/IM服务器开发之架构选择》

《以微博类应用场景为例,总结海量社交系统的架构设计步骤》

《一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践》

《腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT》

《微信技术总监谈架构:微信之道大道至简(演讲全文)》

《如何解读《微信技术总监谈架构:微信之道大道至简》“

《快速裂变:见证微信强大后台架构从0到1的演进历程(一)》

在早期,为了支持业务,它很快就推出了。当时版本流量很低,并发性要求不高。 IM系统的技术架构主要是为了简化和可用性,实现的功能也是非常基础的。

IM1.0是使用PHP开发的,实现了IM基本用户/客户访问,消息传递和咨询列表管理功能。当用户咨询时,将平均分配的策略分配给客户服务,并记录用户和客户服务之间的关系。当用户/客户发送消息时,通过调用消息转发模块将消息转发到另一方的Redis阻塞队列。消息通过HTTP长连接发送到消息轮询模块。它会在有消息时立即返回。如果没有消息,它将阻塞一段时间。这里阻塞的目的是减少轮询间隔。

消息传递模型如下所示:

上图中消息轮询模块的长连接请求通过php-fpm安装在阻塞队列中。当请求变得太多时,如果php-fpm进程无法及时发布,服务器性能会很高,负载会很高。

为了解决这个问题,我们优化了消息轮询模块,并选择了OpenResty框架,通过使用Lua协程来优化php-fmp长期安装问题。 Lua协程将判断是否通过Nginx转发的请求标记拦截网络请求。如果被截获,阻塞操作将被移交给Lua协程进行处理,并且php-fmp将及时发布以减轻服务器的消耗。

优化的处理流程如下图所示:

随着业务的快速增长,IM系统在短期内面临着大量的定制需求,并且已经开发了许多新的业务模块。面对大量的用户咨询,客户服务的服务能力已无法站起来。

因此,IM2.0将专注于改善业务功能体验,例如:

1)在处理用户咨询时,它将从单一的分配方法演变为各种方法,如平均,加权和排队;

2)为了提高客户服务的效率,客户服务的咨询响应还增加了可选配置,如自动回复,常见问题解答等。

以典型的用户咨询场景为例,当用户打开App的可重用且可检索的消息行时;当消息发送时,消息通过消息服务存储在DB中,并根据消息行检索当前的咨询。客户服务,呼叫分配服务的目的是改善当前咨询的客户服务信息;最后将客户服务信息更新为链接关系。

建立完整的消息链接,并将用户/客户服务发送的消息通过转发服务发送给另一方。

上述过程如下图所示:

5.1,概述

业务量不断累积,随着模块的增加,IM系统的代码迅速扩展。由于缺乏统一的代码规范,单一的接口职责以及模块之间的更多耦合,更改一个需求可能会影响其他模块,从而使新需求的开发和维护成本很高。

为了解决这种情况,必须升级IM系统。第一项任务是拆分服务。目前,拆分IM系统分为四大服务,包括客户服务,用户服务,IM服务和数据服务。

如下图所示:

如上所示,我们来看看它:

1)客户服务:提供多种方式来提高客户服务效率和用户体验,如提供集团管理,会员管理,质量检测服务等,以提高客户服务团队的运营和管理水平;通过为用户分配服务和转移服务接收效率更加灵活和高效;支持自动回复,常见问题解答,知识库服务等,提高客户服务咨询效率等;

2)用户服务:分析用户行为,为用户提供兴趣推荐和用户肖像,并计算用户对Macelle商家服务的满意度;

3)IM服务:支持单聊和群聊模式,提供实时消息通知,离线消息推送,历史消息漫游,联系人,文件上传和存储,消息内容风险控制检测等;

4)数据服务:通过收集用户咨询的源门户,是否咨询订单,是否有客户服务接收,用户咨询和客户服务回复的时间信息来定义数据指标,并通过数据分析进行离线数据计算,最后提供外部数据统计。信息。主要指标包括30秒,1分钟响应率,咨询次数,无响应时间,平均响应时间,咨询销售,咨询转换率,建议转换率,分时接收压力,工作状态,服务等级等。/p>

5.2,用户状态流

在现有的IM系统中,用户咨询期间的完整用户状态流程如下图所示:

如上图所示:

1)用户点击咨询按钮触发事件,用户状态进入初始状态;

2)当发送消息时,系统改变要分配的用户状态,并且在通过呼叫分发服务分配相应的客户服务之后,用户状态变为已分配和未解决;

3)当客户服务解决用户或客户服务回复时,用户长时间不说话,触发系统自动解决的操作。此时,用户状态变为已解决,并且咨询过程结束。

5.3。重建IM服务

在服务拆分过程中,我们需要考虑特定服务的多功能性,可用性和降级策略,同时最小化服务之间的依赖关系,并避免由于单个服务不可用而导致整体服务失败的风险。

在此期间,公司的其他业务线对IM服务的使用有越来越多的需求,使用的频率和幅度也开始增加。在IM服务的初始阶段,当连接量很大时,只能通过修改代码来实现水平扩展;当访问新服务时,需要在服务服务器上配置Openresty环境和Lua协程代码,并且服务访问非常不方便,并且IM服务是多功能性也很差。

考虑到上述问题,我们完全重构了IM服务。目标是将IM服务提取到独立模块中,并提供统一的集成和调用方法,而不依赖于其他服务。考虑到IM服务的高处理和低损耗要求,选择Go语言来开发此模块。

新的IM服务设计如下:

其中,更重要的代理层和Exchange层提供以下服务:

1)路由规则:如ip-hash,轮询,最小连接数等,客户端按规则散列到不同的ChannelManager实例;

2)客户端访问管理:连接的连接信息将同步到DispatchTable模块,以便Dispatcher检索;

3)ChannelManager与客户端之间的通信协议:包括建立连接的客户端请求,断开重连,主动断开,心跳,通知,发送和接收消息,消息QoS等;

4)用于在外部提供单一发布和组发送消息的REST接口:有必要根据场景决定是否使用。例如,如果用户咨询客户服务,则需要通过此界面发送消息。

对于上述“4)”点,主要原因有以下三点:

1)当发送消息时,将存在用于创建消息行,分配管家等的逻辑。这些逻辑当前在PHP中实现。 IM服务需要知道PHP的执行结果。一种方法是使用Go重新实现,另一种方法是通过REST接口调用。 PHP返回,这将带来IM服务和PHP业务之间过多的网络交互,影响性能;

2)转发消息时,ChannelManager的多个实例需要相互通信。例如,ChannelManager1上的用户A在ChannelManager2上向客户服务B发送消息。如果实例之间没有通信机制,则无法转发消息。当要扩展ChannelManager实例时,新实例需要与其他现有实例建立通信,这增加了系统扩展的复杂性;

3)如果客户端不支持WebSocket协议,则HTTP长连接循环作为降级方案只能用于接收消息,并且消息需要通过短连接进行处理。其他方案不需要邮件转发。只有通过WebSocket才能直接向ChannelManager发送消息。

5.4。修改后的IM服务调用过程

初始化消息行并分配客户服务进程由PHP服务完成。当需要消息转发时,PHP服务将调用Dispatcher服务的消息传递接口。 Dispatcher服务通过共享的DispatcherTable数据检索接收者所在的ChannelManager实例,并通过RPC将消息发送到实例。 ChannelManager通过WebSocket推送消息。客户。

IM服务呼叫流程如下所示:

当连接数超过当前ChannelManager集群的上限时,只需要扩展ChannelManager实例,ETCD动态通知监控端实现平滑扩展。目前,已经开发了JS-SDK的浏览器版本,其他服务线可以通过访问文档轻松集成IM服务。

在Exchange层的设计中,有3个问题需要测试。

1)多端消息同步:

现在客户端有PC浏览器,Windows客户端,H5,iOS/Android。如果用户登录到多端,当有消息过来时,有必要找出用户的所有连接。当用户的某一端断开连接时,需要定位此连接。

如上所述,连接信息存储在DispatcherTable模块中,因此DispatcherTable模块应该能够根据用户信息快速检索连接信息。 DispatcherTable模块旨在使用Redis的Hash存储。当客户端与ChannelManager建立连接时,要同步的元数据具有uid(用户信息),uniquefield(唯一值,对应于连接的唯一值),wsid(连接标识符)),clientip(客户端ip),serverip(服务器ip),通道(channel),对应的结构大致如下:

通过这种方式,密钥(uid)可用于在用户的多个端点之间找到连接,并通过密钥+字段连接。连接信息的默认到期时间为2小时。目的是防止服务器因客户端连接的异常中断而被捕获,从而在DispatcherTable中存储一些过期数据。

2)用户在线状态同步:

例如,如果用户咨询了4个客户服务,则该用户将出现在4个客户服务的咨询列表中。当用户上线时,请确保四个客户服务用户看到用户在线。

有两种方法可以做到这一点:

一个是客户服务通过轮询获得用户的状态,但是当用户的在线状态没有改变时,会启动许多无效请求;

另一种是当用户上线时,客户服务推送在线通知,这将导致消息传播。咨询过的每个客户服务都需要通知。

最后,我们采取了第二种方式。在推送过程中,我们只将用户状态推送到在线客服。

3)消息不会丢失,不会重复:

为了避免消息丢失,对于长连接轮询方法,我们将在启动请求时带来客户端读取消息的ID,服务器将计算差异消息然后返回;当使用WebSocket方法时,服务器将在推送客户端消息后,等待客户端的ACK,如果客户端没有ACK,服务器将尝试多次推送。

此时,客户端需要根据消息ID执行消息的重复处理,以便客户端可能已经接收到消息,但是ACK确认由于其他原因而失败,触发重试,并且消息被重复。

5.5。 IM服务的消息流

如上所述,IM服务需要支持多个终端,同时,它在角色中被划分为用户侧和商家侧。为了使通知和消息在输出时根据域名,终端和角色动态输出差异化内容,引入DDD。 (域驱动设计)建模方法来处理消息。

流程如下所示:

随着Ma Cell“内容+交易”模式的不断深入,IM系统架构也经历了不同的演进和升级阶段,从最初的粗糙和无序模式到统一管理,逐步规范和形成规模。

我们取得了一些进展,当然,还有很长的路要走。在未来,结合公司业务的发展和团队的技术能力,我们将继续优化IM系统。

目前我们正计划用Go替换消息轮询模块中的服务器代码,这样它就不依赖于PHP和OpenResty环境来实现更好的解耦;此外,我们将探索基于TensorFlow的智能客户服务,通过培训数据模型和分析数据,进一步提高手动客户服务的效率,增强用户体验,更好地为企业提供支持。

[1]关于IM架构设计的文章:

《浅谈IM系统的架构设计》

《简述移动端IM开发的那些坑:架构设计、通信协议和客户端》

《一套海量在线用户的移动端IM架构设计实践分享(含详细图文)》

《一套原创分布式即时通讯(IM)系统理论架构方案》

《从零到卓越:京东客服即时通讯系统的技术架构演进历程》

《蘑菇街即时通讯/IM服务器开发之架构选择》

《腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT》

《微信后台基于时间序的海量数据冷热分级架构设计实践》

《微信技术总监谈架构:微信之道大道至简(演讲全文)》

《如何解读《微信技术总监谈架构:微信之道大道至简》“

《快速裂变:见证微信强大后台架构从0到1的演进历程(一)》

《17年的实践:腾讯海量产品的技术方法论》

《移动端IM中大规模群消息的推送如何保证效率、实时性?》

《现代IM系统中聊天消息的同步和存储方案探讨》

《IM开发基础知识补课(二):如何设计大量图片文件的服务端存储架构?》

《IM开发基础知识补课(三):快速理解服务端数据库读写分离原理及实践建议》

《IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token》

《WhatsApp技术实践分享:32人工程团队创造的技术神话》

《微信朋友圈千亿访问量背后的技术挑战和实践总结》

《王者荣耀2亿用户量的背后:产品定位、技术架构、网络方案等》

《IM系统的MQ消息中间件选型:Kafka还是RabbitMQ?》

《腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面》

《以微博类应用场景为例,总结海量社交系统的架构设计步骤》

《快速理解高性能HTTP服务端的负载均衡技术原理》

《子弹短信光鲜的背后:网易云信首席架构师分享亿级IM平台的技术实践》

《知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路》

《IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列》

《微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)》

《微信技术分享:微信的海量IM聊天消息序列号生成实践(容灾方案篇)》

《新手入门:零基础理解大型分布式架构的演进历史、技术原理、最佳实践》

《一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践》

《阿里技术分享:深度揭秘阿里数据库技术方案的10年变迁史》

《阿里技术分享:阿里自研金融级数据库OceanBase的艰辛成长之路》

《社交软件红包技术解密(一):全面解密QQ红包技术方案架构、技术实现等》

《社交软件红包技术解密(二):解密微信摇一摇红包从0到1的技术演进》

《社交软件红包技术解密(三):微信摇一摇红包雨背后的技术细节》

《社交软件红包技术解密(四):微信红包系统是如何应对高并发的》

《社交软件红包技术解密(五):微信红包系统是如何实现高可用性的》

《社交软件红包技术解密(六):微信红包系统的存储层架构演进实践》

《社交软件红包技术解密(七):支付宝红包的海量高并发技术实践》

《社交软件红包技术解密(八):全面解密微博红包技术方案》

《社交软件红包技术解密(九):谈谈手Q红包的功能逻辑、容灾、运维、架构等》

《即时通讯新手入门:一文读懂什么是Nginx?它能否实现IM的负载均衡?》

《即时通讯新手入门:快速理解RPC技术基本概念、原理和用途》

《多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了》

《从游击队到正规军:马蜂窝旅游网的IM系统架构演进之路》

>>更多类似的文章.

[2]更多相关的架构设计相关文章:

《腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面》

《快速理解高性能HTTP服务端的负载均衡技术原理》

《子弹短信光鲜的背后:网易云信首席架构师分享亿级IM平台的技术实践》

《知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路》

《新手入门:零基础理解大型分布式架构的演进历史、技术原理、最佳实践》

《阿里技术分享:深度揭秘阿里数据库技术方案的10年变迁史》

《阿里技术分享:阿里自研金融级数据库OceanBase的艰辛成长之路》

《达达O2O后台架构演进实践:从0到4000高并发请求背后的努力》

《优秀后端架构师必会知识:史上最全MySQL大表优化方案总结》

《小米技术分享:解密小米抢购系统千万高并发架构的演进和实践》

《一篇读懂分布式架构下的负载均衡技术:分类、原理、算法、常见方案等》

《通俗易懂:如何设计能支撑百万并发的数据库架构?》

《多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了》

《从新手到架构师,一篇就够:从100到1000万高并发的架构演进之路》

>>更多类似的文章.

(本文同时发表于:

海钢网 版权所有© www.120sh.net 技术支持:海钢网 | 网站地图