vivo 超大规模消息中间件实践之路

news2024/12/29 11:08:32

作者:vivo 互联网存储技术团队-Luo Mingbo、中间件团队- Liu Runyun

本文根据“2022 vivo开发者大会"现场演讲内容整理而成。

本文主要介绍超大数据规模场景下分布式消息中间件在vivo的应用实践。

在线业务侧主要从RocketMQ集群部署架构、平台系统架构、日常运维操作平台、监控告警一体化实践以及vivo如何通过建设AMQP消息网关的方式完成所有在线业务服务从RabbitMQ到RocketMQ的业务无感迁移,实现了在线业务消息中间件组件的统一。

大数据侧主要从资源隔离、流量均衡、智能动态限流、集群治理四个维度介绍Kafka在vivo的最佳实践以及Kafka核心技术架构在超大数据规模场景下的缺陷以及未来对Pulsar组件的长线规划和建设。

一、分布式消息中间件在vivo的运营现状

1.1 技术选型

在技术选型上,我们从吞吐量、功能特性、生态集成、开源活跃等多个维度对比了当前主流的分布式消息中间件,最终在线业务侧我们选择基于RocketMQ构建消息平台,依托RocketMQ丰富的功能特性满足业务间削峰、解耦、异步化的需求。

大数据侧我们选择具备高并发、高可用、低延迟、高吞吐能力的分布式消息中间件Kafka。构建超大数据规模处理能力的统一数据接入服务和实时数仓服务。Kafka组件作为统一数据接入服务,是大数据全链路中的咽喉要道,是大数据生态体系建设中不可或缺的重要组件之一。

1.2 规模现状

运营指标方面目前大数据业务侧Kafka集群接入项目数百、接入规模方面Topic数量达到数万、集群日均处理消息达数十万亿条、可用性保障99.99%、单机日均处理消息达数百亿条。

在线业务侧RocketMQ集群接入项目数百、接入规模方面接入数千服务、集群日均处理消息达数百亿条、可用性保障100%,发送平均耗时<1ms。

二、大数据侧消息中间件最佳实践

2.1 Kafka简介

首先我们看下Kafka的官网定义及发展历史,Kafka是由Apache软件基金会开源的一个流处理平台,是一种高吞吐量的分布式发布订阅消息系统。具有高吞吐、低延迟、高并发、高可用、高可扩等特性。

Kafka是由LinkedIn公司在2010年开源,2011年交由Apache软件基金会进行孵化,2012年成为Apache软件基金会的顶级开源项目。

2.2 Kafka在超大数据规模场景下面临的挑战

在超大数据规模场景下我们会面临以下几个问题?

  1. 如何规划资源隔离保证核心业务、高优业务、一般业务之间相互不受影响?

  2. 如何保证集群内部节点间流量均衡,降低单节点或部分节点流量差异太大带来的资源浪费?

  3. 超大数据规模场景下如何进行限流保障集群的稳定性并尽可能降低对业务可用性的影响?

  4. 集群长期运行,客户端版本多样,如何持续保障集群的高可用性?

下面我将从资源隔离、流量均衡、智能动态限流、集群治理四个维度和大家一起交流Kafka在vivo的最佳实践。

2.3 资源隔离

资源隔离的核心作用在于避免业务与业务之间的相互影响,但隔离粒度、资源利用率、运维成本之间如何进行权衡,是我们需要思考的重点。隔离粒度太粗会导致隔离效果不佳,隔离粒度太细会导致资源利用率较低、运维成本增加。

那vivo在Kafka集群资源隔离上是如何平衡三者关系的呢?

首先我们根据业务属性、业务线两个维度进行集群维度的隔离,例如我们在集群划分上分为了商业化专用集群,监控专用集群,日志专用集群等。在集群维度做了机器资源的物理隔离。

同时我们在集群内部引入了资源组的概念。同一个集群内部可以包含多个资源组。每个资源组可以为多个业务提供服务。资源组与资源组之间相互独立。

上图中右上图是我们没有引入资源组概念时集群内部不同业务Topic分区的分散情况,大家可以看到业务A和业务B的Topic分区分散到集群内的所有broker上,若业务A的流量突增可能会造成业务B受到影响,右下图是我们引入资源组概念后不同业务Topic分区的分散情况,可以看到不同业务的topic分区只会分配到自己业务所属的资源组内,即使业务A的流量突增导致机器不可用也不会对业务B造成影响。

引入资源组概念后让我们能在集群内部实现机器资源的逻辑隔离。所以我们在资源隔离方面采用了物理隔离和逻辑隔离两种方式相结合,实现了在超大数据规模场景下Kafka集群的资源隔离方案。

2.4 流量均衡

流量均衡的核心作用在于充分利用集群内部资源,提升资源利用率。Kafka服务作为一个有状态的服务,Kafka在技术架构设计上Topic分区与节点绑定,不支持分区同一副本数据在磁盘和节点维度分散存储。对分区的读写请求都由分区Leader所在节点进行处理。所以Kafka集群流量均衡的本质是Topic分区的分散均衡。

在流量均衡方面我们做两期的建设,第一期我们在分区分散均衡算法上引入机器的实时出入流量、cpu负载、磁盘存储等指标作为负载因子生成分区迁移计划。执行分区迁移后达到流量均衡的目的。流量均衡一期功能上线后我们将资源组内节点间流量差异从数百兆/s降低到数十兆/s。随着集群数据规模的持续增加,我们发现数十兆/s的流量差异依然会造成资源浪费。

所以在流量均衡二期功能建设上我们增加了分区分散均衡、Leader分散均衡、副本分散均衡、磁盘均衡等Kafka元数据指标作为负载因子生成Kafka分区迁移计划,并在分区迁移执行上增加了多种迁移提交策略。流量均衡二期功能上线后我们将资源组内节点间流量差异从数十兆/s降低到十兆以内/s。

上图是我们流量均衡一期功能上线前后资源组内节点的流量监控面板,可以看到一期功能上线前资源组内节点间的流量偏差在数百兆/s。一期功能上线后资源组内节点间流量偏差在数十兆/s以内,资源组内节点间流量偏差降低75%。极大提升了服务端的资源利用率。

上图是我们流量均衡二期功能上线前后资源组内节点的入出流量监控面板,可以看到节点间入出流量偏差从数十兆/s降低到十兆以内/s,资源组内节点间流量偏差降低80%。效果也是非常明显。

2.5 智能动态限流

限流的本质是限制客户端的流量突增以确保服务端的可用性。避免客户端的流量突增导致服务端整体不可用。限流的粒度,限流阈值的设定,资源利用率、服务端稳定性之间应该如何做权衡呢?是我们需要思考的重点。限流粒度太粗会导致限流效果不佳,当大部分业务同时流量突增会对服务端的稳定性带来风险。限流粒度太细服务端应对客服端流量突增能力不足,限流阈值设置太大会给服务端稳定性带来风险,限流阈值设置太小会导致服务端资源利用率较低。

限流方面,

  1. 首先我们采用多平台联合诊断机制根据项目实际生产数据情况判别是否需要进行流量调整,计算调整后的限流阈值。其中多平台包含(JMX统一指标采集平台,统一监控平台、统一告警平台、Kafka集群管理平台等)。

  2. 第二、智能分析Kafka集群服务资源负载情况,计算各资源剩余情况。确定是否可以进行阈值调整并结合客户端实际生产数据情况计算阈值调整到多少合适。

  3. 第三、自动实时调整限流阈值。

通过以上三步实现智能动态限流方案。解决了限流粒度、限流阈值设定、资源利用率、Kafka集群可用性四者之间的平衡关系。

实现智能动态限流后给我们带来以下几点明显的收益。

  1. 大大提升Kafka集群服务端应对客户端流量突增的能力。

  2. 利用项目错峰的方式进一步提升Kafka集群的资源利用率。

  3. 智能化自动调整项目限流阈值无需人工介入,大大降低Kafka集群在超大数据规模场景下的运维成本。

  4. 动态根据服务端负载情况调整项目限流阈值,尽可能减小限流对业务可用性的影响。

2.6 集群治理

Kafka集群元数据统一由ZooKeeper集群管理,元数据信息永久有效永不过期,元数据的下发由Kafka Controller节点统一下发,随着业务的不断发展,数据规模的不断增加,集群内部Topic的数量达到万级,分区数量达到数十万级。元数据治理能有效避免元数规模给Kafka集群稳定性带来的影响。随着接入的服务、Kafka用户越来越多,正确的使用Kafka 客户端也能大大提升Kafka服务端的稳定性和资源利用率。Kafka分区与磁盘目录绑定,创建Topic、Topic分区扩容时根据Topic流量合理设置Topic分区数能有效避免单机或单盘性能瓶颈成为集群整体的性能瓶颈。

vivo在Kafka集群治理方面实现了节点流量偏差治理、Topic元数据治理、Topic分区数据倾斜治理、Topic超大分区治理、Topic消费延迟治理等方案为Kafka集群的高可用性保驾护航。

2.7 实践经验沉淀

vivo Kafka消息中间件团队在三年时间内,根据实际的业务场景和生产数据规模沉淀了较多的实践经验。例如在高可用/高可扩方面实现了机架感知、弹性伸缩、数据压缩等能力建设,在监控告警方面提供了用户限流告警、Topic流量突增告警、消费延迟告警、Leader实时监控告警,多平台联合故障感知告警等能力建设。我们为Kafka集群做了很多的扩展能力建设,那解决了Kafka集群在超大数据规模场景下的所有问题了吗?答案是否定的。

接下来我们一起看看Kafka集群在超大数据规模场景下面临的新挑战。

2.8 Kafka在超大数据规模场景下由技术架构带来的缺陷

由Kafka架构设计所带来的一些痛点无法通过扩展能力解决,并且Kafka架构设计上分区同一副本数据与磁盘强绑定不支持分散存储、不支持存储与运算分离、不支持冷热数据分层存储等设计缺陷在超大数据规模场景下显得尤为明显。所以在超大数据规模场景下Kafka集群面临了以下几个痛点

  1. 资源利用率低。

  2. 无法快速响应业务增长。

  3. 故障恢复时间长。

  4. 历史数据消费故障率高(主要体现在磁盘io性能上)。

2.9 大数据侧分布式消息中间件未来规划

基于以上Kafka在架构设计上的缺陷,vivo Kafka团队于2021年开始对另一款开源分布式消息中间件Pulsar进行调研。

2.9.1 Pulsar简介

我们看下Pulsar的官网定义及发展史:Pulsar 是 Apache软件基金会的顶级开源项目,是集消息、存储、轻量化函数式计算为一体的下一代云原生分布式消息流组件,采用了计算与存储分离的架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有高并发、高吞吐、低延时、高可扩,高可用等特性。

Pulsar 诞生于2012 雅虎公司内部,2016年开源交由Apache软件基金会进行孵化,2018年成为Apache软件基金会顶级开源项目。

2.9.2 Pulsar核心优势

基于Pulsar支持存算分离,分区数据分散存储、冷热数据分层存储、Broker无状态等架构设计,让Pulsar在超大数据规模场景下具备了资源利用率较高、快速响应业务增长、秒级故障恢复、实时流量均衡、支持海量数据存储等明显优势。

2.9.3 Pulsar未来规划

我们对Pulsar组件的规划分为四个阶段,包含项目启动、稳定性建设、能力进阶、稳定运营。

目前我们处在Pulsar组件稳定性建设阶段。

2022年我们的目标是打造支持日均万亿级消息处理能力的Pulsar集群,完成分层存储,监控告警一体化、KoP功能平台化等扩展能力建设。

计划2023年打造具备日均十万亿级消息处理能力的Pulsar集群,达到行业一流水准。并完成Pulsar broker容器化部署、Pulsar生态体系建设、Pulsar Sql和Pulsar Function的应用调研等扩展能力建设。

将在2024年实现日均数十万亿级消息处理能力的Pulsar集群,达到行业超一流的水准。

三、在线业务侧消息中间件最佳实践

3.1 RocketMQ简介

RocketMQ是阿里巴巴于2012年开源的低延时、高并发、高可用、高可靠的分布式消息中间件,具有海量消息堆积、高吞吐、可靠重试等特性。

RocketMQ于2012年开源,2016年进入Apache孵化,于2017年成为Apache顶级项目。

3.2 RocketMQ在vivo内部使用现状

vivo中间件团队在2021年引入RocketMQ并且完成了高可用和平台化建设。

当前分别在多个机房部署了多个集群供业务使用,每日消息量数百亿。

集群分布在多个机房,每日消息量级也不低,高可用运维保障是有难度的。

3.3 vivo基于RocketMQ的高可用保障实践经验

3.3.1 集群部署架构介绍

为了更好的保障集群的高可用,我们采用了双机房热备的方式进行集群搭建。

我们会在两个机房进行Broker的部署,业务Topic会默认分布在两个机房,以此来保障在一个机房内的Broker节点异常时业务可以保持正常生产消费能力。

业务默认是会优先使用本机房的节点进行生产消费,只有在异常时才会自动快速完成跨机房的流量切换。

同时我们构建了一个BrokerController模块用于实现Broker节点的主从切换,以此保障集群容量的快速恢复。

双机房热备模式有哪些优势呢?

  • 第一,消息无需跨机房复制,降低对机房专线的依赖;

  • 第二,可以降低业务发送消息的延时,也可以提升业务的处理性能;

双机房热备模式的劣势是每个机房的节点都需要冗余一定的buffer来支撑其它机房的节点异常时自动转移过来的业务流量。

3.3.2 平台系统架构介绍

集群双机房热备部署模式是消息平台的高可用基石,在此之外我们还建设了多个平台模块来保障平台的高可靠。

如上图所示,

  • mq-rebalance模块用于支撑集群流量的自动负载均衡;

  • mq-monitor模块进行监控指标的采集并且与vivo内部的监控系统打通;

  • mq-recover模块主要用于业务流量的降级和恢复处理;

  • mq-live模块用于集群的探活。

另外我们还基于社区的connector组件建设了RabbitMQ-connector,实现了全球消息路由能力。

后续我们计划建设基于gRPC协议建设通用的消息网关实现与集群的交互,以此屏蔽不同的消息中间件选型。

3.3.3 运维能力平台化提升运维效率

主要有三点实践:

第一,RocketMQ集群配置平台化管理。RocketMQ集群含有较多的配置项,默认是通过节点文件管理的,在大规模集群运维过程中会存在维护困难的问题。

通过平台化管理可以确保集群内配置统一,节点在启动时从平台中读取到所有的配置,避免在集群部署时需要登录到机器进行配置维护,并且我们支持了集群配置的动态生效。

第二,运维操作平台化,例如Broker节点的流量摘除与挂载、Topic一键扩缩容等直接通过平台支撑,实现便捷运维。

第三,集群维护平台化,我们将集群与Broker节点的关系维护在平台中,并且在首次部署时分配Broker节点所在集群,这样在平台上就有清晰的集群信息,便于我们维护管理多套集群。

3.3.4 平台监控告警能力建设

  • 一方面,我们为每个集群都建设了如上图所示的监控大盘。

在监控大盘中有每个集群的生产消费流量、业务生产消费统计、发送耗时等信息,支撑我们快速观察集群的运行状态,方便日常巡检。

消息中间件作为在线业务请求处理链路中的关键环节,高可用尤为关键。监控大盘中的发送耗时信息是我们认为观察集群是否稳定运行的最关键的指标。

  • 另一方面,我们对集群构建了丰富的监控告警能力。

如上图所示,我们分别对主机维度、集群维度、Topic/Group维度、客户端维度都做了监控指标埋点上报。

通过丰富的监控告警,我们可以及时发现问题并快速介入处理问题,详细的监控告警也可以帮助我们快速确认问题根源。

3.4 业务从RabbitMQ无感迁移到RocketMQ实战经验

3.4.1 使用RocketMQ替换RabbitMQ根因分析

分别从可用性保障性能容量功能特性对比RabbitMQ和RocketMQ。

  • 可用性保障方面,RabbitMQ集群无负载均衡能力,队列流量实际由集群内某个节点承载,存在瓶颈。其次RabbitMQ存在脑裂问题,从我们的运维经验看如果出现网络故障集群通常无法自动恢复,并且可能丢失少量数据。

  • 性能方面,RabbitMQ集群整体性能较低,并且不支持水平扩展。

  • 容量方面,从我们的运维经验看,当消息堆积到千万后,RabbitMQ性能就会有所下降。在大量消息堆积开始消费后,因为RabbitMQ的背压流控机制,最终可能会因为集群负载过大导致发送限流甚至发送阻塞。

  • 功能特性方面,RabbitMQ不支持消费异常延时重投递功能,也不支持消息轨迹、事务消息、顺序消息等特性。

而RocketMQ在可用性保障、性能、容量、功能特性方面相对于RabbitMQ都是更优的。

  • 可用性保障方面,RocketMQ采用多主多从的松耦合架构部署,主从间通过同步双写保障消息的可靠性和一致性。

  • 性能方面,Topic可以分布在多个Broker中,实现水平扩容,并且RocketMQ支持从从节点拉取消息,读写分离的设计很好的支持了业务读取冷数据的诉求。

  • 容量方面,RocketMQ使用磁盘存储,磁盘容量就是消息的存储容量,利用从从节点拉取冷数据特性,海量消息堆积对消息写入性能基本无影响。

  • 功能特性方面,RocketMQ支持了消息轨迹、事务消息、顺序消息等特性。

综合分析,RocketMQ可以更好的支撑互联网业务的诉求。

3.4.2 AMQP消息网关架构支撑实现无感迁移

由于当前RabbitMQ已经有数千个服务接入,为了让业务不修改代码即可迁移到RocketMQ,我们建设了一个AMQP消息网关来实现MQ协议的解析和流量转发。

如上图所示,MQ-Proxy模块用于解析AMQP协议,代理客户端的生产消费请求。

RabbitMQ的元数据信息存在在集群中,并且与RocketMQ元数据概念存在差异,为此我们建设了MQ-Meta模块用于维护Exchange/Queue极其绑定关系等元数据信息,并且Proxy模块可以动态感知元数据变更。

另外,为了更好的支撑业务诉求,我们对AMQP协议进行了扩展,支持了局部有序和批量消费能力。

3.4.3 RabbitMQ和RocketMQ元数据概念映射

为了更好的整合RabbitMQ和RocketMQ,我们对它们的元数据进行了一一对应。

其中将RabbitMQ的Exchange映射为RocketMQ的Topic,Queue映射为Group,RoutingKey映射为消息头的一个参数,VirtualHost映射为Namespace。

为什么将RoutingKey映射为消息头的一个参数而不是Tag呢?这是因为RabbitMQ的RoutingKey是有模糊匹配过滤能力的,而RocketMQ的Tag是不支持模糊匹配的。

另外我们还通过扩展使得RocketMQ也支持了RoutingKey过滤。

在经过多轮优化后,在1KB消息体场景下,一台8C16G的机器在单发送下可支撑超过九万的TPS,单推送可以支撑超过六万TPS,性能上很好的满足了当前业务的诉求。

3.5 在线业务消息中间件的未来规划

主要有两部分:

一方面,我们希望可以调研升级到RocketMQ5.0版本架构,RocketMQ5.0的存算分离架构可以更好的解决我们当前遇到的存储瓶颈问题,Pop消费可以帮助我们实现更好的消费负载均衡。

我们还希望可以基于gRPC协议建设统一的消息网关能力。

另一方面,我们希望可以探索消息中间件容器化部署,提供消息中间件的快速弹性扩缩容能力,更好的支持业务需求。

四、总结

回顾vivo消息中间件演进历史,我们完成了在线业务消息中间件从RabbitMQ迁移到RocketMQ,大数据消息中间件正在从kafka演进为使用pulsar支撑。

我们理解消息中间件将继续朝着云原生演进,满足业务快速增长的诉求,充分利用云的优势为业务提供极致的体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EMC基础:电容的频率特性

本文将对其中使用电容和电感降噪的对策进行介绍&#xff0c;这也可以称为“噪声对策的基础”。在这里使用简单的四元件模型。如果要进一步表达高频谐振时&#xff0c;可能需要更多的元件模型。 电容的频率特性 探讨利用电容器来降低噪声时&#xff0c;充分了解电容器的特性是…

设计模式——软件设计原则

目录 3.软件设计原则 3.1 开闭原则 3.2 里氏代换原则 3.3 依赖倒转原则 3.4 接口隔离原则 3.5 迪米特法则 3.6 合成复用原则 3.软件设计原则 在软件开发中&#xff0c;为了提高软件系统的可维护性和可复用性&#xff0c;增加软件的可扩展性和灵活性&#xff0c;程序员要…

8、Servlet——Servlet生命周期、Servlet特性

目录 一、Servlet生命周期 1、生命周期的四个阶段 1.1 实例化 1.2 初始化 1.3 服务 1.4 销毁 2、Servlet执行流程 3、代码演示 二、 Servlet特性 1、线程安全问题 2、如何保证线程安全 一、Servlet生命周期 1、生命周期的四个阶段 1.1 实例化 当用户第一次访问Ser…

flutter裁剪三角形,并设置三角形最长边阴影(类似钉钉登录页右上角图标样式)

需求 需要使用flutter创建类似钉钉登录页右上角图表样式 过程 图标 图标直接从阿里巴巴图标库中下载png文件&#xff0c;并设置相应颜色 三角形阴影 样式的主要难点在三角形及三角形阴影这里 1、三角形的裁剪有两种方法&#xff1a; 第一种是 使用边框实现三角形 参考博客…

springboot自动加载--自定义启动器

创建自定义启动器 0、项目总览 1、创建项目&#xff0c;引入依赖 创建项目 spring-boot-jdbc-starter&#xff0c;引入依赖&#xff0c;pom文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apa…

b站黑马Vue2后台管理项目笔记——(1)登录功能

说明&#xff1a; 此项目中使用的是本地SQL数据库&#xff0c;Vue2。 其他功能请见本人后续的其他相关文章。 本文内容实现的最终效果如下图&#xff1a; 目录 一&#xff0e;登录功能的实现 1.登录页面的布局&#xff1a; &#xff08;1&#xff09;查看当前工作区是否干净…

读锁应该插队吗?什么是锁的升降级?

背景 ReentrantReadWriteLock可以设置公平或非公平&#xff0c;为什么&#xff1f; 读锁插队策略 每次获取响应锁之前都要检查能否获取 readerShouldBlockwriterShouldBlock 公平锁 final boolean writerShouldBlock() {return hasQueuedPredecessors(); } final boolean …

打造智慧工地,低代码平台助力基建行业全链路数字化升级

编者按&#xff1a;基建行业数字化转型需求迫切&#xff0c;低代码平台有助于加快数字化转型速度&#xff0c;赋能建筑工程企业升级。本文分析了低代码在基建行业中的应用价值&#xff0c;并指出基建行业对于低代码平台的需求&#xff0c;最后通过相关案例的展示了低代码平台在…

低代码平台解读:“低代码+PaaS”的技术创新实践

数字化转型已经成为必然趋势&#xff0c;几乎所有传统行业都喊出了数字化转型的口号。但在数字化转型中&#xff0c;很多企业面临着成本高、周期长的难题。低代码是其中一种破解难题的方式&#xff0c;如今的低代码已经是企业数字化的核心引擎。 低代码平台越来越多&#xff0…

数据结构——链表(五)

数据结构 文章目录数据结构前言一、什么是链表二、实现单链表1.单链表的结构2.单链表的初始化3.单链表的插入4.遍历链表5.链表长度总结前言 接下来学习一下链表&#xff0c;链表比数组用的更多。 一、什么是链表 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存…

《从0开始学大数据》之如何自己开发一个大数据SQL引擎

背景 大数据仓库 Hive&#xff0c;作为一个成功的大数据仓库&#xff0c;它将 SQL 语句转换成 MapReduce 执行过程&#xff0c;并把大数据应用的门槛下降到普通数据分析师和工程师就可以很快上手的地步。 但是 Hive 也有自己的问题&#xff0c;由于它使用自己定义的 Hive QL …

Linux常用命令——repquota命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) repquota 报表的格式输出磁盘空间限制的状态 补充说明 repquota命令以报表的格式输出指定分区&#xff0c;或者文件系统的磁盘配额信息。 语法 repquota(选项)(参数)选项 -a&#xff1a;列出在/etc/fstab文…

gRPC 基础(二)-- Go 语言版 gRPC-go

gRPC-Go Github gRPC的Go实现:一个高性能、开源、通用的RPC框架&#xff0c;将移动和HTTP/2放在首位。有关更多信息&#xff0c;请参阅Go gRPC文档&#xff0c;或直接进入快速入门。 一、快速入门 本指南通过一个简单的工作示例让您开始在Go中使用gRPC。 1.1 先决条件 Go:…

word排版技巧:这几种特殊版式轻松搞定

我们在许多报刊、杂志中会见到一些带有特殊效果的文档&#xff0c;如首字下沉、分栏排版、竖排文档等形式的排版效果。这些效果其实不是只有专业排版软才能实现&#xff0c;利用Word我们可以轻松完成这些排版效果。1、首字下沉首字下沉是一种突出显示段落中的第一个汉字的排版方…

3小时快速上手sharding-jdbc

今日目标 1、理解分库分表基础概念【垂直分库分表、水平分库分表】 2、能够说出sharding-jdbc为我们解决什么问题 3、理解sharding-jdbc中的关键名词 4、理解sharding-jdbc的整体架构及原理 5、掌握sharding-jdbc的集成方式1.分库分表介绍 1.1 分库分表概述 分库分表就是为了…

普元EOS_工作流引擎相关数据表记录---工作流工作笔记002

由于现在在用普元的工作流引擎,但是,说明文档中没有对数据表的说明 所以整理一下记录下来: 业务流程(com.eos.workflow.data.WFProcessDefine) 属性 名称 类型 processDefID 业务流程ID long processDefName 业务流程名称 String processChName 业务流程显示名称 String desc…

计算机图形学 第5章 二维变换与裁剪完结

目录中点分割直线段裁剪算法中点计算公式代码Liang-Barsky直线段裁剪算法⭐⭐⭐代码&#xff1a;多边形裁剪算法/Sutherland-Hodgman裁剪算法代码相关学习资料&#xff1a;中点分割直线段裁剪算法 中点分割直线段裁剪算法对Cohen-Sutherland直线裁剪算法的第3种情况做了改进&a…

Centos 安装部署 Sentinel

在微服务架构中&#xff0c;业务高峰时段&#xff0c;请求过多可能导致直接查询数据库&#xff0c;造成雪崩等事故。 一、雪崩问题 微服务调用链路中某个服务故障&#xff0c;引起整个链路中所有服务不可用。 解决方案 1&#xff09;超时处理 设置超时时间&#xff0c;请求超…

最近超火的ChatGPT到底怎么样?体验完后我有哪些感受和思考?

✔️本文主题&#xff1a;ChatGPT 人工智能 ✔️官方网站&#xff1a;chat.openai.com 文章目录前言二、初识三、深入四、编程相关编写纠错五、感想六、展望七、结语前言 大家好&#xff0c;这次我们来聊一聊最近超级火的人工智能语音——ChatGPT&#xff01; ChatGPT是什么&…

从 synchronized 到 CAS 和 AQS的超详细解析

文章目录一、Synchronized 关键字二、悲观锁和乐观锁三、公平锁和非公平锁四、可重入锁和不可重入锁五、CAS5.1、操作模型5.2、重试机制&#xff08;循环 CAS&#xff09;5.3、底层实现5.4、ABA 问题六、可重入锁 ReentrantLock七、AQS7.1、请求锁7.2、创建 Node 节点并加入链表…