分析-MQ消息队列中间件-在IM即时通讯系统的用途

IM即时通讯开发MQ消息队列 1)用户的聊天消息离线存储环节:因为IM消息的发送属于高吞吐场景,直接操纵DB很容易就把DB搞挂了,所以离线消息在落地入库前,可以先扔到MQ消息队列中,再由单独部署的消费者来有节奏地存储到DB中;2)用户的行为数据收集环节:因为用户的聊天消息和指令等,可以用于大数据分析,而且基于国家监管要求也是必须要存储一段时间的,所以此类数据的收集同样可以用于MQ消息队列,再由单独部署的消费者存储到DB中;库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。如何解决以上问题呢? 阅读详情

MQ消息队列在IM即时通讯的用途

  • 1)用户聊天消息的离线存储环节:因为IM消息的发送属于高吞吐场景,直接操作DB可能会让DB崩溃,所有离线消息在落地入库前,可以先扔到MQ消息队列中,再由单独部署的消费者来有节奏地存储到DB中;
  • 2)用户的行为数据收集环节:因为用户的聊天消息和指令等,可以用于大数据分析,而且基于国家监管要求也是必须要存储一段时间的,所以此类数据的收集同样可以用于MQ消息队列,再由单独部署的消费者存储到DB中;
    1. 用户的操作日志收集环节:log这种数据价值不高,但关键时刻又非常有用,而且数据量又很大,要想存储起来难度很高,这时就轮到Linkedin公司开源的Kafka出场了;

典型的消息队列原理图

img

MQ消息队列的典型应用场景

MQ消息队列广泛应用在中大型分布式系统中,主要使用的场景包括:异步处理 , 应用解耦 , 流量削峰和 即时通讯 四个场景.

1.异步处理

场景介绍:典型的IM即时通讯系统中, 用户注册成功后需要发送注册邮件 / 注册通知短信

传统解决方案:

  • 1)串行的方式:即将注册信息写入数据库成功后、发送注册邮件、再发送注册短信。以上三个任务全部完成后,返回给客户端;

  • 2)并行方式:即将注册信息写入数据库成功后,发送注册邮件的同时,同时发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。

  • 分析:假设每个业务节点耗时50ms,则串行方式耗时150ms,并行方式耗时100ms. 假设CPU每秒钟吞吐量是100次,串行方式CPU每秒请求1000/150=7次,并行化的方式请求次数是1000/100=10次.

    可以看到传统的解决方案的系统性能(并发量\吞吐量\响应时间)会有瓶颈

引入消息队列

  • 将不是必须的业务逻辑,进行异步处理.

img

  • 使用消息队列进行改造之后,用户的响应时间=注册信息写入数据库的时间50ms+(发送注册邮件+发送注册短信)写入消息队列的时间ms,系统的吞吐量提升到20QPS,比串行提高了3倍.

2.应用解耦

场景说明:典型的电商购物平台,用户下单之后,订单系统需要通知库存系统

传统解决方法

  • 订单系统 调用 库存系统接口—如果库存系统无法访问,则订单库存更改将失败,从未导致订单失败------订单系统和库存系统存在耦合

引入消息队列

  • 订单系统: 下单之后完成持久化处理,将消息写入消息队列,返回下单成功

  • 库存系统: 订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。

  • 下单之后,订单系统就不用管后续操作了,订单系统实现了和库存系统的应用解耦

3.流量削峰

场景介绍:流量削峰在大型秒杀活动中使用广泛,秒杀活动因为流量过大导致流量暴增应用挂掉.

引入消息队列:使用消息队列可以 控制活动的人数 + 缓解短时间内高流量压垮应用

用户的请求被服务器接收后,首先

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

4.日志处理

是什么?:日志处理是指将消息队列用在日志处理中,比如Linkedin这种大型职业社交应用架构中Kafka的应用(Kafka就是Linkedin开发并开源的),解决大量日志传输的问题。

日志采集客户端–写入—>kafka消息队列<–订阅消费—日志处理应用

  • 日志采集客户端:负责日志数据采集,定时写入Kafka队列;
  • Kafka消息队列:负责日志数据的接收,存储和转发;
  • 日志处理应用:订阅并消费kafka队列中的日志数据。

5.即时消息通讯

  • 即时消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的即时消息通讯场景。比如实现点对点消息队列或者IM聊天室等

    (但Jack Jiang认为,在中大型IM系统中,MQ并不适合这么用,具体的讨论请见:《请教可以使用MQ消息队列中间件做即时通讯系统吗?》)。不建议

    img

    • 点对点通讯:客户端A和客户端B使用同一队列,进行消息通讯;
    • 聊天室通讯:客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。实现类似聊天室效果。
单纯从技术上看,IM系统的所有数据路径无非就是3种情况:
1)消息从A客户端 -> 经由服务器->再转发给B客户端:即C to S to C;
2)消息从A客户端直发服务端:即C to S;
2)消息从服务器直发A客户端:即S to C。

而消息中间件里的订阅模式:
即生产者推送消息到MQ、再由消费者从MQ读取,理论上是完全可以实现上面所说的3种消息传递路径的,如果要实现IM消息的生产和消费,基本上就是一个用户对应一个队列,而大量用户存在的情况下就是大量的队列产生,而每个队列的消息流转其实很少,试想一个人聊天时能发出多少消息?。

但存在一个问题的:
本身MQ被设计来的目的是处理大量的消息的,也即是通常的应用场景下,不会有多少队列存在,但每个队列每秒都要满负荷处理大量的消息,而假设你来开发MQ中间的话,你也能想到:你最大的优化目标是将每个队列的消息处理吞吐做到最大化,而不应该把处理大量的队列连接、断开、重连这些事情做为MQ存在的意义。

综上:
我的个人意见是,没有行不行,而是合不合适,所以就看你怎么选择了。有的人因为IM系统很小,为了省事或偷懒,也真就是用MQ来实现的,但除非你老板懂技术,不然谁管你。

推荐消息队列

总的来说,RabbitMQ 和 Kafka 都是十分优秀的分布式的消息代理服务,只要合理部署,基本上可以满足生产条件下的任何需求。

分享十万级TPS的IM即时通讯综合消息系统的架构 如何设计一款高性能、高并发、高可用的im综合消息平台是很多公司发展过程中会碰到且必须要解决的问题。比如一家公司内部的通讯系统、各个互联网平台的客服咨询系统,都是离不开一款好用且维护的方便im综合消息系统。那么,我们应该怎么样来设计一款三高特性的im系统,并能同时支持各个业务线的接入(比如:内部OA通讯、客服咨询、消息推送等等功能)有呢? im第一版设计的初衷是公司需要一款im消息中间件用于支撑客服咨询业务。但是,考虑到为了方便日后其他业务线也能接入消息沟通平台,所以一开始就将整个消息中心的能力需求给到中间件 阅读详情

相关推荐

[VisionPro] CogPMAlignTool 工具详解

[VisionPro] [CogPMAlignTool] [模板匹配]

weixin_43163656的博客 1万+

java 集群im服务器消息路由,使用rabbitmq实现集群im聊天服务器消息的路由

单机系统的时候,客户端和连接都有同一台服务器管理。image.png在本地维护一份userId到connetciont的映射服务器可以根据userId找出对应的连接,然后把消息push出去image.png但是集群环境下,连接分布在不同的机器,小明向小张发消息时跨了机器image.png小明向小张发的消息,需要小张的对应连接的服务器才能推送要完成这个需求需要解决两个问题:1、聊天服务器这么多,怎么...

weixin_34124963的博客 764

28-基于STM32单片机的便携式健康监测系统设计与实现(程序+原理图+元件清单)

本文详细介绍了基于STM32单片机的便携式健康监测系统设计与实现,该系统集成MAX30102光电传感器和MSP20压力传感器,实时监测心率、血氧和血压等关键生理指标。通过STM32F103C8T6主控芯片和HC-05蓝牙模块,实现数据采集、处理及无线传输,具有便携性高、操作简便等特点,适用于家庭健康监护和户外运动场景。

weixin_29191669的博客 420

Spring+JMS+使用JMS+ActiveMQ中间件+实现简单聊天功能的小例子

当前,CORBA、DCOM、RMI等RPC中间件技术已经广泛应用于各个领域。但是这些中间件的局限性很明显,主要表现在以下方面: (1)同步通信:客户发出调用后,必须等待服务对象的完成处理并返回结果后才能继续执行。 (2)客户和服务对象的生命周期紧密耦合:客户进程和服务对象进程都必须正常运行;如果服务对象崩溃或者网络故障导致客户的请求不可达,客户会接收到异常。 (3)点对点通信:客户的一次调用

ilovejava_2010的专栏 2394

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

yang1067155909的专栏 4290

跨平台商品模型大解析:亚马逊 vs 阿里 vs 拼多多

本文深入探讨了亚马逊、阿里巴巴和拼多多三大电商平台的商品模型设计,分析了它们在变体关系、商品抽象层级和SKU定义等方面的异同。亚马逊模型以物流和变体为中心,强调全球仓配体系下的标准化管理;阿里模型采用多视角的弹性结构,适用于多类目、多品牌、多卖家环境;拼多多模型则结合平台标准化与商家个性化,适合短期促销和快速上新场景。文章还提供了实践建议,帮助自研电商平台或商品中台的开发者选择合适的商品结构,并强调了商品模型在电商系统中的核心作用。通过对比分析,本文旨在为读者提供商品建模的启发和参考。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

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

1、前言 在IM这种讲究高并发、高消息吞吐的互联网场景下,MQ消息中间件是个很重要的基础设施,它在IM系统的服务端架构中担当消息中转、消息削峰、消息交换异步化等等角色,当然MQ消息中间件的作用远不止于此,它的价值不仅仅存在于技术上,更重要的是改变了以往同步处理消息的思路(比如进行IM消息历史存储时,传统的信息系统作法可能是收到一条消息就马上同步存入数据库,这种作法在小并发量的情况下可以...

WGH100817的博客 537

大语言模型原理与工程实践:行业大语言模型的评测:以金融行业大语言模型为例

大语言模型、金融行业、模型评测、自然语言处理、深度学习、Transformer、BERT、GPT 1. 背景介绍 近年来,大语言模型(Large Language Model,LLM)在自然语言处理(Natural Language Processing,NLP)领域取得了突破性的进

AI大模型应用之禅 136

(转)IM系统的MQ消息中间件选型:Kafka还是RabbitMQ?

1、前言 在IM这种讲究高并发、高消息吞吐的互联网场景下,MQ消息中间件是个很重要的基础设施,它在IM系统的服务端架构中担当消息中转、消息削峰、消息交换异步化等等角色,当然MQ消息中间件的作用远不止于此,它的价值不仅仅存在于技术上,更重要的是改变了以往同步处理消息的思路(比如进行IM消息历史存储时,传统的信息系统作法可能是收到一条消息就马上同步存入数据库,这种作法在小并发量的情况下可以很好的...

lgh3293的博客 806

倍福CX9020(WINCE 7)控制器使用方法和操作

CX9020系列是倍福控制器中较为经济的,操作系统为Windows Embedded Compact 7(简称WINCE7或WINEC7),相对高端控制器(WINES7以上系统),操作系统古老而简洁,上位机软件的编写困难很多,本文是笔者在使用过程中摸索的流程,旨在为CX9020系列的新用户提供参考,也可供其他CE系统的控制器参考。本文中大部分截图采用倍福中国的培训文档,这是由于笔者是在流程走通后再写这篇文章,不想再恢复出厂设置走一遍截图。因笔者在写这篇文章时使用倍福控制器经验并不丰富,难免有纰漏,请读者批评

weixin_41883890的博客 4286

Xilinx平台SRIO介绍(一)RapidIO协议介绍

菜鸟到老鸟:会用工具; 老鸟到大佬:深入理解原理。 ——FPGA大叔·沃自己硕得

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

亿级流量 即时通讯IM系统 设计详解(全)

设计该系统的业务逻辑,之后针对性的优化从整体框架掌握各个深层次的框架知识点,以此查漏补缺秒杀系统设计详解短域名系统设计详解(全)LVS四层负载均衡架构详解系统设计面试题-如何设计10亿流量的即时通讯(IM)系统?记笔记的同时融入了一些自已的见解和拓展。

码农研究僧的博客 6618

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

m0_51579041的博客 1万+

消息队列(MQ)比较

消息队列比较1.消息队列(MQ)比较 1.消息队列(MQ)比较 1.MQ使用场景 异步通信 有些业务不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把消息放入队列,但并不立即处理它。想在队列中放入多少消息就放多少,然后在需要的时候再去处理他。 解耦 降低工程间的强依赖程度,针对异构系统进行适配。在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。通过消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口,当应用发生变化时,可以独立的扩展或修改两边的处理过

嵌入式与人工智能 1474

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

多维度分析主流消息队列技术差异

摘自https://www.cnblogs.com/imstudy/p/11064589.html 1、引言 对于即时通讯网来说,所有的技术文章和资料都在围绕即时通讯这个技术方向进行整理和分享,这一次也不例外。对于即时通讯系统(包括IM、消息推送系统等)来说,MQ消息中件间是非常常见的基础软件,但市面上种类众多、各有所长的MQ消息中件间产品,该怎么去选择?这是个问题! 对于很多经验不足的开发者来说,一个公司内部用的IM聊天系统,总用户量也不过百十来人,动辄就是Kafka、MongoDB,美其名曰为了高

AsapDawn的博客 282

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

1、引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一。 消息从发送者到接收者的典型传递方式有两种: 1)一种我们可以称为即时消息:即消息从一端发出后(消息发送者)立即就可以达到另一端(消息接收者),这种方式的具体实现就是平时最常见的IM聊天消息; 2)另一种称为延迟消息:即消息从某端发出后,首先进入一...

hellojackjiang2011的博客 422

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

MQ干货分享

一些关于MQ的内容分享

qq_62775328的博客 921

即时通讯技术文集(第18期):IM架构设计基础知识合集 [共16篇]

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

hellojackjiang2011的博客 247

消息中间件Kafka与RabbitMQ谁更胜一筹?

在 IM 这种讲究高并发、高消息吞吐的互联网场景下,MQ 消息中间件是个很重要的基础设施,它在 IM 系统的服务端架构中担当消息中转、消息削峰、消息交换异步化等角色。当然,MQ 消息中间件的作用远不止于此,它的价值不仅仅存在于技术上,更重要的是改变了以往同步处理消息的思路。比如进行 IM 消息历史存储时,传统的信息系统作法可能是收到一条消息就马上同步存入数据库,这种作法在小并发量的情况下可以很好的...

weixin_34418883的博客 125

IM|im-service

IM|im-service

无限进步 925

即时通讯技术文集(第30期):IM开发综合技术合集(Part3) [共16篇]

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

hellojackjiang2011的博客 879
上一篇: 2019百度之星开发者大赛-复盘
下一篇: 论文-EdgeCloudSim: An environment for performance evaluation of edge computing systems-笔记
酱油瓶啤酒杯
博客等级 码龄8年 35粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值