腾讯QQ IM后台架构演进:从10万到1.4亿在线的挑战与解决方案

需积分: 42 20 下载量 44 浏览量 更新于2024-08-16 收藏 2.24MB PPT 举报
"IM后台架构-1.4亿在线背后的故事-腾讯-QQ-IM后台架构的演化与启示" 本文主要探讨了腾讯QQ即时通讯(IM)后台架构的发展历程,从十万级到亿级在线用户的支持,以及在此过程中所面临的挑战和解决方案。文章由腾讯即通平台部高级技术总监icezhuang在2011年的腾讯大讲堂走进北航活动中分享,他介绍了自己在腾讯参与IM后台研发运营的经验,并展示了QQ后台架构的几个重要阶段。 1. IM后台1.0架构 这个阶段的架构适用于同时在线用户数较低的情况,通常在十万级。核心设计包括接入服务器和存储服务器,其中接入服务器维护了一个核心数据结构,用于存储用户在线状态和好友列表。好友列表按照UIN(用户标识)和好友标志位进行升序排序,便于快速查找。登录和在线状态获取等基本业务流程主要通过接入服务器和存储服务器之间的交互完成。 2. IM后台1.5架构 随着业务需求的增加,如视频、语音和文件传输等实时宽带业务,原有的架构需要进行升级。于是引入了长连接服务器,负责处理不能直接连接的客户端的实时宽带数据中转。同时,存储服务器进行了轻重分离,核心服务器专注于稳定性,而扩展服务器则用来快速响应业务变化和增长。 3. 百万级在线挑战 当用户规模达到百万级时,原有架构面临内存、带宽和处理能力的瓶颈。以接入服务器为例,每个在线用户的存储量增加,导致内存压力巨大。因此,需要更优化的架构来支撑更大规模的并发连接。 4. 高可用性和容灾机制 为了应对高并发和可能的故障,架构中引入了集群化设计,包括长连接集群、同步集群、接入集群、存储集群,以及专门的容灾指挥集群。这些集群分布在不同的IDC(互联网数据中心),确保了系统的冗余和高可用性。运维控制集群和监控报警集群的设立,保证了系统能够及时发现并处理问题,保证99.99%的可用性。 5. 容灾指挥中心 在多个IDC之间设置容灾指挥中心,是保证服务连续性的关键策略。这使得系统在面对单一IDC故障时,能够快速切换至其他IDC,保证服务不受影响。 总结起来,QQ IM后台架构的演进是一个从简单到复杂,从单一到分布,从低负载到高并发,从无容灾到有备无患的过程。每个阶段的改进都基于实际业务需求和用户规模的增长,体现了腾讯在海量服务处理上的深入理解和实践经验。

根据实验所测数据F:0.160; w:1.005; lgw:0.002; DA:2.000; AD:2.004; M:1.002; DB:0.017; DU:-0.778; Re:1.002; Im:-0.014; F:0.200; w:1.257; lgw:0.099; DA:2.000; AD:2.006; M:1.003; DB:0.026; DU:-1.224; Re:1.003; Im:-0.021; F:0.250; w:1.571; lgw:0.196; DA:2.000; AD:2.011; M:1.006; DB:0.048; DU:-2.610; Re:1.004; Im:-0.046; F:0.320; w:2.011; lgw:0.303; DA:2.000; AD:2.018; M:1.009; DB:0.078; DU:-2.045; Re:1.008; Im:-0.036; F:0.400; w:2.513; lgw:0.400; DA:2.000; AD:2.031; M:1.016; DB:0.134; DU:-2.880; Re:1.014; Im:-0.051; F:0.500; w:3.142; lgw:0.497; DA:2.000; AD:2.050; M:1.025; DB:0.214; DU:-6.120; Re:1.019; Im:-0.109; F:0.630; w:3.958; lgw:0.597; DA:2.000; AD:2.079; M:1.040; DB:0.336; DU:-8.838; Re:1.027; Im:-0.160; F:0.800; w:5.027; lgw:0.701; DA:2.000; AD:2.133; M:1.067; DB:0.559; DU:-8.208; Re:1.056; Im:-0.152; F:1.000; w:6.283; lgw:0.798; DA:2.000; AD:2.219; M:1.110; DB:0.903; DU:-14.040; Re:1.076; Im:-0.269; F:1.260; w:7.917; lgw:0.899; DA:2.000; AD:2.363; M:1.182; DB:1.449; DU:-15.869; Re:1.136; Im:-0.323; F:1.590; w:9.990; lgw:1.000; DA:2.000; AD:2.634; M:1.317; DB:2.392; DU:-24.638; Re:1.197; Im:-0.549; F:2.000; w:12.566; lgw:1.099; DA:2.000; AD:3.056; M:1.528; DB:3.682; DU:-43.200; Re:1.114; Im:-1.046; F:2.520; w:15.834; lgw:1.200; DA:2.000; AD:3.303; M:1.652; DB:4.358; DU:-78.466; Re:0.330; Im:-1.618; F:3.180; w:19.981; lgw:1.301; DA:2.000; AD:2.475; M:1.238; DB:1.851; DU:-116.222; Re:-0.547; Im:-1.110; F:4.000; w:25.133; lgw:1.400; DA:2.000; AD:1.437; M:0.719; DB:-2.871; DU:-140.400; Re:-0.554; Im:-0.458; F:5.000; w:31.416; lgw:1.497; DA:2.000; AD:0.834; M:0.417; DB:-7.597; DU:-156.600; Re:-0.383; Im:-0.166; F:6.340; w:39.835; lgw:1.600; DA:2.000; AD:0.473; M:0.237; DB:-12.523; DU:-161.259; Re:-0.224; Im:-0.076; F:8.000; w:50.265; lgw:1.701; DA:2.000; AD:0.253; M:0.127; DB:-17.958; DU:-166.320; Re:-0.123; Im:-0.030; F:10.000; w:62.832; lgw:1.798; DA:2.000; AD:0.226; M:0.113; DB:-18.938; DU:-165.600; Re:-0.109; Im:-0.028; ,求出其对应的相位角φ(w)

2023-06-11 上传

from pdb import set_trace as st import os import numpy as np import cv2 import argparse parser = argparse.ArgumentParser('create image pairs') parser.add_argument('--fold_A', dest='fold_A', help='input directory for image A', type=str, default='../dataset/50kshoes_edges') parser.add_argument('--fold_B', dest='fold_B', help='input directory for image B', type=str, default='../dataset/50kshoes_jpg') parser.add_argument('--fold_AB', dest='fold_AB', help='output directory', type=str, default='../dataset/test_AB') parser.add_argument('--num_imgs', dest='num_imgs', help='number of images',type=int, default=1000000) parser.add_argument('--use_AB', dest='use_AB', help='if true: (0001_A, 0001_B) to (0001_AB)',action='store_true') args = parser.parse_args() for arg in vars(args): print('[%s] = ' % arg, getattr(args, arg)) splits = os.listdir(args.fold_A) for sp in splits: img_fold_A = os.path.join(args.fold_A, sp) img_fold_B = os.path.join(args.fold_B, sp) img_list = os.listdir(img_fold_A) if args.use_AB: img_list = [img_path for img_path in img_list if '_A.' in img_path] num_imgs = min(args.num_imgs, len(img_list)) print('split = %s, use %d/%d images' % (sp, num_imgs, len(img_list))) img_fold_AB = os.path.join(args.fold_AB, sp) if not os.path.isdir(img_fold_AB): os.makedirs(img_fold_AB) print('split = %s, number of images = %d' % (sp, num_imgs)) for n in range(num_imgs): name_A = img_list[n] path_A = os.path.join(img_fold_A, name_A) if args.use_AB: name_B = name_A.replace('_A.', '_B.') else: name_B = name_A path_B = os.path.join(img_fold_B, name_B) if os.path.isfile(path_A) and os.path.isfile(path_B): name_AB = name_A if args.use_AB: name_AB = name_AB.replace('_A.', '.') # remove _A path_AB = os.path.join(img_fold_AB, name_AB) im_A = cv2.imread(path_A, cv2.IMREAD_COLOR) im_B = cv2.imread(path_B, cv2.IMREAD_COLOR) im_AB = np.concatenate([im_A, im_B], 1) cv2.imwrite(path_AB, im_AB),解释上述代码,并告诉我怎么设置文件夹格式

2023-06-10 上传