中间件技术及双十一实践·软负载篇

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
性能测试 PTS,5000VUM额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:

软负载——分布式系统的引路人

综述

软负载是分布式系统中极为普遍的技术之一。在分布式环境中,为了保证高可用性,通常同一个应用或同一个服务的提供方都会部署多份,以达到对等服务。而软负载就像一个引路人,帮助服务的消费者在这些对等的服务中合理地选择一个来执行相关的业务逻辑。

1.1、ConfigServer

ConfigServer主要提供非持久配置的发布和订阅。07/08年间在淘宝内部开发使用的时候,由于ZooKeeper还没有开源,不然可能会基于ZooKeeper来进行改造。主要使用场景是为分布式服务框架提供软负载功能所必须的服务地址列表。
结合淘宝业务场景的发展,与ZooKeeper相比主要有以下一些特点:

  • ConfigServer基于无Master架构ConfigServer是无中心化的架构,不存在单点问题,通过特定的算法进行数据增量同步。
  • ConfigServer支持数据的自动聚合配置数据的聚合功能是ConfigServer结合淘宝的使用场景开发的特殊功能,主要使用场景:集群服务地址发现。每台机器向ConfigServer注册自己的服务元信息,ConfigServer会根据服务名和分组自动聚合所有元数据,提供给服务订阅方使用。
  • ConfigServer是推数据的模型ConfigServer的服务端与客户端是基于长连接的方式进行通信,在客户端订阅关系确定后,配置信息一旦发生变化,会主动推送配置数据到客户端,并回调客户端的业务监听器。
  • ConfigServer客户端本地容灾ConfigServer客户端在收到配置数据时,会记录到本地容灾文件中。在ConfigServer服务端不可用的时候,应用继续使用内存中数据;即使应用这时候重启,ConfigServer的客户端使用本地容灾文件进行离线启动。

1.2、ConfigServer双11准备与优化

面对双11巨大的网站请求,对ConfigServer的数据推送环节考验尤其巨大,如何稳定、高效且正确的完成数据推送任务,成为双11前夕困扰ConfigServer团队最大的问题。在平时的正常运行中,ConfigServer管理的配置数据和订阅者数量已经达到一定量级,服务端的一次重启可能会引起大量的数据推送。举例来说:交易的某个服务有2000台,每个服务发布者信息200B,订阅者5000个,那么这个交易服务可用地址列表有变动,会产生2GB(2000*200B*5000)的数据推送。交易的应用有很多个服务,如果应用发布或者重启,会瞬间产生巨大的流量将ConfigServer服务端的网卡压满。当网卡压满后:保持长连接的心跳检测包会超时,导致与客户端的连接会持续在一个不稳定的状态,集群间数据同步也会受影响。
针对这个问题, ConfigServer在推送数据上做了两个方面的优化:

  • 流量控制加入出口流量统计和监控,通过严格限制出口流量预留出足够的带宽给维持心跳和集群数据同步。这样即使有数据堆积,只会暂时的影响到数据推送,客户端的连接不会频繁的断开,集群之间的同步也不会受到影响。
  • 减少推送量出于两方面考虑:压缩数据对代码的侵入不大;ConfigServer服务端CPU相对空闲,最终我们采用压缩数据的方式来减小数据包。我们经过对比主流的压缩算法(huffman,defalte,BZip2,LZMA)对真实推送数据的压缩测试,最终选择defalte算法。该功能上线后的检测结果显示1500M的推送数据最终推送大小为170M。效果很明显。

1.3、Diamond

Diamond主要提供持久配置的发布和订阅服务,最大特点是结构简单,稳定可靠。Diamond的主要使用场景是用来进行动态数据库切换与扩容,进行一些业务系统运行时开关配置的推送。Diamond产品专注于高可用性,基于此在架构、容灾机制、数据获取模型上有一些与同类产品的不同之处。

Diamond结构非常简单,也属于是无单点的架构模型,

发布或者更新配置数据时,步骤如下:

  • 写入MySql数据库
  • 写本地磁盘
  • 通知集群其他机器去数据库dump更新的数据

订阅方获取配置数据时,直接读取服务端本地磁盘文件,尽量减少对数据库压力。
这种架构用短暂的延时换取最大的性能和一致性,一些配置不能接受延时的情况下,通过API可以获取数据库中的最新配置。

容灾机制

Diamond作为一个分布式环境下的持久配置系统,有一套完备的容灾机制,数据存储在:数据库、服务端磁盘、客户端缓存目录以及可以手工干预的容灾目录。客户端通过API获取配置数据按照固定的顺序去不同的数据源获取数据:容灾目录->服务端磁盘->客户端缓存。因此,面对如下情况,Diamond均能很好的应对:

  • 数据库主库不可用,可以切换到备库,Diamond继续提供服务
  • 数据库主备库全部不可用,Diamond通过本地缓存可以继续提供读服务
  • 数据库主备库全部不可用,Diamond服务端全部不可用,Diamond客户端使用缓存目录继续运行,支持离线启动
  • 数据库主备库全部不可用,Diamond服务端全部不可用,Diamond客户端缓存数据被删,可以通过拷贝备份的缓存目录到容灾目录下继续使用

综上所述,只有在同时碰到如下四个条件的情况下,客户端应用才无法启动: 数据库主备库全部不可用、Diamond服务端全部不可用、Diamond客户端缓存被清空、客户端没有备份的缓存文件。

1.4、Diamond双11准备与优化

长轮询改造

客户端采用推拉结合的策略在长连接和短连接之间取得一个平衡,让服务端不用太关注连接的管理,又可以获得长连接的及时性。

  • 客户端发起一个对比请求到服务端,请求中包含客户端订阅的数据的指纹
  • 服务端检查客户端的指纹是否与最新数据匹配
    • 如果匹配,服务端持有连接
    • 如果30秒内没有相关数据变化,服务端持有连接30秒后释放
    • 如果30秒内有相关数据变化,服务端立即返回变化数据的ID
  • 如果不匹配,立即返回变化数据的ID
  • 客户端根据变化数据的ID去服务端获取最新的内容

Diamond通过这种多重容灾机制以及推拉结合的方式,让客户端逻辑尽量简单,而且高效稳定,使其成为名副其实的“钻石”。

小结

软负载系统引导着分布式请求的来龙去脉,管理着分布式离散数据的聚合与分发,成为了合理且最大化使用分布式系统资源的保证。在2013年的双11购物狂欢节中,面对巨大的消费者请求,ConfigServer集群共10台机器,支撑近60,000长连接,发布配置总量700,000条,订阅配置总量3,000,000条,数据推送峰值600MB/S。Diamond集群共48台,90,000条非聚合配置,380,000条聚合配置,TPS高峰期间达到18000,数据变更15000次,客户端感知最大延时小于2秒。双十一当天部分数据库做了切换,用户完全没有感知。

相关文章
|
5月前
|
中间件 程序员 开发工具
Django实践-08中间件的应用
Django实践-08中间件的应用
Django实践-08中间件的应用
|
1月前
|
消息中间件 存储 RocketMQ
消息中间件-RocketMQ技术(二)
消息中间件-RocketMQ技术(二)
|
1月前
|
消息中间件 存储 中间件
消息中间件-RocketMQ技术(一)
消息中间件-RocketMQ技术(一)
|
2月前
|
存储 中间件 PHP
Python编程入门:从零到一的代码实践深入理解 PHP 中的中间件模式
【8月更文挑战第28天】本文旨在通过浅显易懂的方式,向初学者介绍Python编程的基础知识,并结合具体代码示例,带领读者一步步实现从零基础到能够独立编写简单程序的转变。文章将围绕Python语言的核心概念进行讲解,并通过实例展示如何应用这些概念解决实际问题。无论你是编程新手还是希望扩展技能的专业人士,这篇文章都将为你打开编程世界的大门。 【8月更文挑战第28天】在PHP的世界中,设计模式是构建可维护和可扩展软件的重要工具。本文将通过浅显易懂的语言和生动的比喻,带领读者深入理解中间件模式如何在PHP应用中发挥魔力,实现请求处理的高效管理。我们将一步步揭开中间件的神秘面纱,从它的定义、工作原理到
|
3月前
|
JSON 中间件 数据处理
实践出真知:通过项目学习Python Web框架的路由与中间件设计
【7月更文挑战第19天】探索Python Web开发,掌握Flask或Django的关键在于理解路由和中间件。路由连接URL与功能,如Flask中@app.route()定义请求响应路径。中间件在请求处理前后执行,提供扩展功能,如日志、认证。通过实践项目,不仅学习理论,还能提升构建高效Web应用的能力。示例代码展示路由定义及模拟中间件行为,强调动手实践的重要性。
52 1
|
3月前
|
设计模式 中间件 测试技术
PHP中的中间件模式解析与实践
【7月更文挑战第11天】在现代Web开发中,中间件模式已成为设计高效、可维护应用程序的关键。本文深入探讨了PHP环境下中间件模式的实现方法,并提供了一个实际示例来演示如何利用中间件优化请求处理流程。
34 1
|
3月前
|
运维 中间件 PHP
深入理解PHP中的中间件模式自动化运维之脚本编程实践##
【7月更文挑战第31天】在PHP开发中,中间件模式是一种强大的设计模式,它允许开发者在请求处理流程中注入自定义的处理逻辑。本文将通过实际代码示例来探讨如何在PHP项目中实现和使用中间件,以及这种模式如何提升应用程序的可维护性和扩展性。 【7月更文挑战第31天】 在现代IT运维管理中,自动化不再是可选项,而是提高生产效率、确保服务质量的必需品。本文将通过Python脚本编程的角度,探讨如何利用代码简化日常运维任务,提升工作效率。我们将从实际案例出发,逐步剖析自动化脚本的设计思路、实现过程及其带来的益处。 ##
24 0
|
消息中间件 运维 Kubernetes
带你读《云原生架构白皮书2022新版》——云原生中间件
带你读《云原生架构白皮书2022新版》——云原生中间件
602 7
|
5月前
|
数据采集 消息中间件 Oracle
通过流计算与消息中间件实现Oracle到ADB的实时数据同步链路优化实践
介绍基于流计算与消息中间件链路(Oracle->OGG->DataHub->Flink/Blink->ADB)实现的Oracle到ADB的数据实时同步架构潜在问题及处理方案。
206 0
通过流计算与消息中间件实现Oracle到ADB的实时数据同步链路优化实践
|
开发框架 前端开发 Java
java程序设计与j2ee中间件技术/软件开发技术(III)-大作业-采用MVC模式实现商品信息的查询显示(可以模糊查询)、增加和删除功能,商品表自拟,实现简单菜单操作和分页显示(二)
java程序设计与j2ee中间件技术/软件开发技术(III)-大作业-采用MVC模式实现商品信息的查询显示(可以模糊查询)、增加和删除功能,商品表自拟,实现简单菜单操作和分页显示
189 2