特来电是一个互联网公司,而且是技术领先的互联网公司。互联网公司的标配是什么?答案就是缓存+MQ。没错,您没看错,就是MQ--消息队列,我们今天要讨论的RabbitMQ就是消息队列中功能非常强大的一种。那么RabbitMQ在特来电是如何应用的呢?这就是今天这篇博文的目的,让您连接RabbitMQ在特来电的深度应用!

1.一张图看懂MQ的地位

RabbitMQ具有和关系型数据库、内存数据库同等的地位,作为最底层的组件,为上层调用提供服务。在特来电,几乎所有应用系统都是分布式部署,而RabbitMQ是分布式系统的基础组件。

2.RabbitMQ集群在特来电的部署方式

为了最大限度的保证可用性,避免单个节点的故障而影响整个系统的运行,RabbitMQ使用集群方式搭建,并配合HAProxy来提供负载均衡功能。

目前在生产环境,我们通过三台RabbitMQ服务器、两台HAProxy服务器来保证每天接近900W的消息分发与处理。

3.分布式任务计算平台(MAC)在特来电的广泛使用

消息队列对于应用解耦、流量削峰等具有极大的优势。分布式任务计算平台--MAC是处理RabbitMQ消息的主要途径之一,何为分布式任务计算平台?

处理MQ消息是一件非常复杂的事情,虽然说MQ官方会推出对应的调用SDK,但对于具体使用方式、异常处理、性能调优、异常补偿等,都会增加使用者的学习成本,并且对于SDK的统一升级等都会非常复杂。鉴于此,特来电公共技术部经过仔细调研,开发了分布式任务计算平台简化了处理MQ消息复杂性,并通过支持分布式部署、水平扩展、自动重试、流量安全控制、通过任务插件注入的方式来简化使用MQ的复杂性,并通过一系列的辅助来保证最终数据处理的一致性。

分布式任务计算平台是作为MQ的消费者Consumer而存在。

截止到目前为止,分布式任务计算平台共有274类不同任务,承载着900W的消息处理。

4.分布式任务计算平台(MAC)主动对流量的控制

还记得我们说过,MQ的两个主要功能:应用解耦和流量削峰。生产环境274类不同任务支撑了不同应用之间的解耦,但没有主动控制流量削峰。

为什么以前我们不主动对流量进行主动控制,而现在要主动控制呢?

究其原因,我们认为对于每个消息的处理应该是尽可能的快,但随着业务之间的交互越来越复杂,消息的处理总是达不到消息到来的速度。尽管分布式任务计算平台会尽可能增大消息处理并发数。但在消息峰值来临时,会对后端的业务处理带来更大的压力,严重时,可能会拖垮系统的运行,影响公司整体业务的处理。基于此,我们在MAC端增加主动控制流量,在业务系统可接受的影响范围内,进行消息的处理。

MAC将是否主动控制流量的配置进行了极大的简化,只需在对应的任务元数据配置流量控制阈值及时间单元即可启用,MAC会主动控制消息的消费速率在阈值范围内。

5.MAC如何解决RabbitMQ消息全部被接收到Client端,造成Client端内存占用高的问题

实际使用RabbitMQ过程中,如果完全不配置QoS,这样RabbitMQ会尽可能快速地发送队列中的所有消息到MAC。MAC会在本地缓存所有的消息,从而极有可能导致OOM或者导致服务器内存不足而影响其它进程的正常运行。所以我们需要通过设置Qos的prefetch count来控制MAC缓存的消息数量,同时设置得当也会提高MAC的吞吐量。

prefetch count并不是说设置得越大越好。过大可能导致consumer处理不过来,一直在本地缓存的BlockingQueue里呆太久,这样消息在客户端的延迟就大大增加;而对于多个consumer的情况,则会分配不均匀,导致有些consumer一直在忙,有些则非常空闲。然而设置的过小,又会令到consumer不能充分工作,因为我们总想它100%的时间都是处于繁忙状态,而这时可能会在处理完一条消息后,BlockingQueue为空,因为新的消息还未来得及到达,所以consumer就处于空闲状态了。

MAC会根据一定的方式,依照流量控制阈值来设置RabbitMQ的prefetch Count,将MAC缓存消息的数量控制在一定范围内,减少MAC缓存消息占用的内存。

prefetch Count相关的内容请参考:http://zclau.com/2016/09/15/RabbitMQ%E7%9A%84Qos-prefetch/

总结:

RabbitMQ 作为消息队列产品的佼佼者,提供了丰富的功能来满足业务需求,而特来电人也在基于RabbitMQ做最大限度的深度应用,集群部署、分布式任务计算平台、主动流量控制等都是我们对RabbitMQ深度应用。

在RabbitMQ的使用路上,参考我们具体的业务需求及RabbitMQ提供的特性,我们还会创造出更多有价值的功能。

在RabbitMQ的使用之路上,有你我不孤单。

RabbitMQ在特来电的深度应用的更多相关文章

  1. 分享 rabbitMQ入门详解

    原文地址http://blog.csdn.net/cugb1004101218/article/details/21243927 目录(?)[-] rabbitMQ说明文档 rabbitMQ是什么 消 ...

  2. Kafka深度解析

    本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/01/02/Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅 ...

  3. 【深度学习系列】PaddlePaddle垃圾邮件处理实战(一)

    PaddlePaddle垃圾邮件处理实战(一) 背景介绍   在我们日常生活中,经常会受到各种垃圾邮件,譬如来自商家的广告.打折促销信息.澳门博彩邮件.理财推广信息等,一般来说邮件客户端都会设置一定的 ...

  4. RabbitMQ 发布订阅

    互联网公司对消息队列是深度使用者,因此需要我们了解消息队列的方方面面,良好的设计及深入的理解,更有利于我们对消息队列的规划. 当前我们使用消息队列中发现一些问题: 1.实际上是异步无返回远程调用,由发 ...

  5. Kafka深度解析(如何在producer中指定partition)(转)

    原文链接:Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能 ...

  6. RabbitMQ各协议异同详解

    一.官网介绍 Which protocols does RabbitMQ support? RabbitMQ supports several messaging protocols, directl ...

  7. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  8. Flink 源码解析 —— 深度解析 Flink 是如何管理好内存的?

    前言 如今,许多用于分析大型数据集的开源系统都是用 Java 或者是基于 JVM 的编程语言实现的.最着名的例子是 Apache Hadoop,还有较新的框架,如 Apache Spark.Apach ...

  9. Flink 源码解析 —— 深度解析 Flink 序列化机制

    Flink 序列化机制 https://t.zsxq.com/JaQfeMf 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac 上搭 ...

随机推荐

  1. Python之groupby

    # -*- coding: utf-8 -*-"""Created on Sat Jun 30 10:09:47 2018测试分组groupby@author: zhen ...

  2. Python进阶点

    1. 模块化设计,分而治之 2. 组合数据类型 2.1 集合类型:list.set(无序/不重复),用于数据去重 2.2 序列类型:字符串.元组.列表(有序) 2.3 字典类型:根据字典中 k/v 来 ...

  3. scrapy爬取校花网男神图片保存到本地

    爬虫四部曲,本人按自己的步骤来写,可能有很多漏洞,望各位大神指点指点 1.创建项目 scrapy startproject xiaohuawang scrapy.cfg: 项目的配置文件xiaohua ...

  4. [MapReduce_5] MapReduce 中的 Combiner 组件应用

    0. 说明 Combiner 介绍 &&  在 MapReduce 中的应用 1. 介绍 Combiner: Map 端的 Reduce,有自己的使用场景 在相同 Key 过多的情况下 ...

  5. 软工实践作业2:个人项目实战之Sudoku

    Github:Sudoku 项目相关要求 项目需求 利用程序随机构造出N个已解答的数独棋盘 . 输入 数独棋盘题目个数N(0<N<=1000000). 输出 随机生成N个不重复的已解答完毕 ...

  6. Alpha冲刺! Day11 - 砍柴

    Alpha冲刺! Day11 - 砍柴 今日已完成 晨瑶: gitkraken团队协作流程教程基本完工. 昭锡:将主页包含UI界面.逻辑处理等与底部栏整合,学习Retrofit网络库. 永盛:更多 c ...

  7. Appium 实战练习一

    # -*- coding:utf-8 -*- ''' Created on Sep 30, 2018 @author: SaShuangYiBing Comment: ''' import time ...

  8. [NOIP2018]旅行

    嘟嘟嘟 鉴于一些知道的人所知道的,不知道的人所不知道的原因,我来发NOIPday2T1的题解了. \(O(n ^ 2)\)的做法自然很暴力,枚举断边断环为链就行了. 所以我是来讲\(O(nlogn)\ ...

  9. 【转】一个域名是用哪里的DNS来解析的,电脑怎么知道找哪一个DNS呢? 我注册域名的时候会在服务商那里配置DNS解析,一般需要24小时后才能访问,我想知道,解析后的这个数据是不是会同步到世界上所有的DNS服务器呢!如果不是,当我访问我的这个域名的时候,电脑怎么知道去找到我注册的这一家的DNS服务器呢,谁告诉他的呢?

    看看DNS一些基础知识,你就了解了.1.DNS就是域名服务器,他的任务就是确定域名的解析,比如A记录MX记录等等. 2.任何域名都至少有一个DNS,一般是2个.为什么要2个以上呢?因为DNS可以轮回处 ...

  10. pump模块的学习-metamask

    pump = require('pump') pump简介 https://github.com/terinjokes/gulp-uglify/blob/master/docs/why-use-pum ...