探索 RocketMQ:企业级消息中间件的选择与应用

news2024/11/25 19:48:30

一、关于RocketMQ

RocketMQ 是一个高性能、高可靠、可扩展的分布式消息中间件,它是由阿里巴巴开发并贡献给 Apache 软件基金会的一个开源项目。RocketMQ 主要用于处理大规模、高吞吐量、低延迟的消息传递,它是一个轻量级的、功能强大的消息队列系统,广泛应用于金融、电商、日志系统、数据分析等领域。

c41a6a12-fb7d-47b5-b0a0-a6e1a437a07d

RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等,总之就是葛大爷的一句话。

8d2af478-f112-4738-9d28-6a20ed02c5fa

二、发展

消息队列属于最经典的中间件之一,已经有 30 多年的历史,其发展历程可以总结为几个阶段:

  • 第一阶段,2000 年之前。这个阶段的消息队列供应商是几家商业软件巨头,比如 IBM、Oracle、Microsoft 都有自己的商业化 MQ,其中最具代表性的是 IBM MQ,价格昂贵,面向高端企业,主要是大型金融、电信等企业;这类商业 MQ 一般采用高端硬件,软硬件一体机交付,MQ 本身的软件架构是单机架构。
  • 第二阶段,2000~2007 年。进入 00 年代后,初代开源消息队列崛起,诞生了 JMS、AMQP 两大标准,与之对应的两个实现分别为 ActiveMQ、RabbitMQ,他们引领了初期的开源消息队列技术。开源极大的促进了消息队列的流行、降低了使用门槛,技术普惠化,逐渐成为了企业级架构的标配。
  • 第三阶段,2007~2017 年。PC 互联网、移动互联网爆发式发展。由于传统的消息队列无法承受亿级用户的访问流量和海量数据传输,诞生了互联网消息中间件,核心能力是全面采用分布式架构、具备很强的横向扩展能力,开源典型代表有 Kafka、RocketMQ,闭源的还有淘宝 Notify。

RocketMQ 发展的主要历程:

2007年:淘宝实施了“五彩石”项目,“五彩石”用于将交易系统从单机变成分布式,也是在这个过程中产生了阿里巴巴第一代消息引擎——Notify。

2010年:阿里巴巴B2B部门基于ActiveMQ的5.1版本也开发了自己的一款消息引擎,称为Napoli,这款消息引擎在B2B里面广泛地被使用,不仅仅是在交易领域,在很多的后台异步解耦等方面也得到了广泛的应用。

2011年:业界出现了现在被很多大数据领域所推崇的Kafka消息引擎,阿里巴巴在研究了Kafka的整体机制和架构设计之后,基于Kafka的设计使用Java进行了完全重写并推出了MetaQ 1.0版本,主要是用于解决顺序消息和海量堆积的问题。

2012年:阿里巴巴开源其自研的第三代分布式消息中间件——RocketMQ

经过几年的技术打磨,阿里称基于RocketMQ技术,目前双十一当天消息容量可达到万亿级。

2016年11月:阿里将RocketMQ捐献给Apache软件基金会,正式成为孵化项目。

阿里称会将其打造成顶级项目。这是阿里迈出的一大步,因为加入到开源软件基金会需要经过评审方的考核与观察。

坦率而言,业界还对国人的代码开源参与度仍保持着刻板印象;而Apache基金会中的342个项目中,暂时还只有Kylin、CarbonData、Eagle 、Dubbo和 RocketMQ 共计五个中国技术人主导的项目。

2017 年,RocketMQ 成功通过了 Apache Incubator 的评审,正式成为 Apache 顶级项目(Top-Level Project, TLP) 。这个标志性事件不仅提升了 RocketMQ 在全球开源社区的影响力,也使其获得了更多来自外部社区的支持和贡献。

2017年2月20日:RocketMQ正式发布4.0版本,专家称新版本适用于电商领域,金融领域,大数据领域,兼有物联网领域的编程模型。

2023 年,RocketMQ 发布了 5.x 版本,继续强化其在云原生、容器化环境中的应用,并且在微服务架构中发挥了重要作用。此版本在性能、可扩展性和稳定性方面进行了进一步优化,增强了在异构环境下的跨平台兼容性,并扩展了更多高级特性,如 精准消息投递更加细粒度的消息过滤 等。

以上就是RocketMQ的整体发展历史,其实在阿里巴巴内部围绕着RocketMQ内核打造了三款产品,分别是MetaQNotifyAliware MQ

这三者分别采用了不同的模型,MetaQ主要使用了拉模型,解决了顺序消息和海量堆积问题;Notify主要使用了推模型,解决了事务消息;而云产品Aliware MQ则是提供了商业化的版本。

三、功能特点

  1. 高可靠性: RocketMQ 提供了强大的消息可靠性保证机制。它支持 消息持久化,即使在系统崩溃后,消息仍然可以恢复。此外,RocketMQ 提供了消息重试机制,确保消息不会丢失。

  2. 高吞吐量: RocketMQ 的设计目标之一就是高吞吐量。它通过高效的网络通信和存储方式,能够处理大量的并发请求,适用于大规模分布式场景。

  3. 分布式架构: RocketMQ 使用 分布式架构,其主要组件包括 NameServer(负责服务发现),Broker(消息存储与转发),Producer(消息生产者),Consumer(消息消费者)。RocketMQ 具有水平扩展性,能够支持多台机器集群化部署,保证了系统的高可用性和弹性扩展。

  4. 顺序消息支持: RocketMQ 提供了强大的 顺序消息支持。对于需要保证消息顺序的应用,RocketMQ 可以通过同一队列中存储顺序消息,确保消费顺序的一致性。

  5. 多种消息模型: RocketMQ 支持多种消息模型,如:

    • 点对点模式(P2P) :消费者独占某个队列的消息,保证一个消息只被一个消费者消费。
    • 发布/订阅模式(Pub/Sub) :多个消费者可以订阅同一个主题(Topic),消息广播到所有消费者。
  6. 高可扩展性: RocketMQ 通过分区(Topic 分区)和分布式的消息存储,可以横向扩展,支持大规模消息的存储和处理。可以灵活地根据业务需求进行扩展。

  7. 多语言客户端支持: RocketMQ 提供了多种客户端 SDK,支持 Java、C++、Python、Go 等多种语言,方便开发者进行跨语言集成。

  8. 事务消息: RocketMQ 提供了 事务消息功能,可以支持分布式事务场景中的消息可靠性保证。通过事务消息,开发者可以保证消息与本地事务的一致性。

  9. 消息回溯与重试机制: 支持消息的 回溯功能,允许消费者查看过去的消息,还支持消息的 重试机制,确保消息处理失败时不会丢失。

  10. 灵活的消息过滤: RocketMQ 支持消息的 标签过滤(Tag-based filtering),允许消费者根据消息的标签过滤需要的消息。

四、对比其它中间件

特性RocketMQKafkaRabbitMQActiveMQNATS
开发背景阿里巴巴开发,2010 年开源,现为 Apache 顶级项目LinkedIn 开发,2011 年开源,现为 Apache 顶级项目Pivotal(现 VMware)开发,开源项目Apache 软件基金会开发,支持多协议的消息队列开源项目,初衷为轻量级实时消息传递
消息协议自定义协议,兼容 MQTT、OpenMessaging 等自定义协议(Kafka 协议)支持 AMQP、STOMP、MQTT 等多种协议支持 AMQP、OpenWire、MQTT 等多种协议NATS 协议,专注于简单的 Pub/Sub 模型
性能与吞吐量高吞吐量,低延迟,适用于高并发场景主要侧重吞吐量,适用于大数据流处理吞吐量较低,适用于中小型企业吞吐量较低,适合中小型企业应用极低的延迟和极高的吞吐量,专注于实时性
消息模型支持点对点(P2P)和发布/订阅(Pub/Sub)模式主要是发布/订阅(Pub/Sub)模型支持点对点(P2P)和发布/订阅(Pub/Sub)模型支持点对点(P2P)和发布/订阅(Pub/Sub)模型支持 Pub/Sub 模型
消息存储顺序写入,支持高效的消息持久化顺序写入,按日志存储,支持高效的消息持久化使用内存/磁盘存储,支持消息持久化使用内存/磁盘存储,支持消息持久化存储较为简单,不强调持久化
扩展性支持分布式部署,高可用,支持水平扩展高扩展性,支持分布式部署和多副本机制集群模式,但扩展性不如 RocketMQ 和 Kafka支持集群模式,扩展性相对较差高扩展性,适用于大规模水平扩展
高可用性支持主从复制,集群模式,容错性高多副本机制,较强的容错性支持镜像队列和集群模式,容错性较好支持主从复制和集群模式,容错性一般支持集群模式和多节点部署,容错性较好
事务消息原生支持事务消息和分布式事务不支持原生事务消息,需自行实现支持事务消息,但性能不如 RocketMQ支持事务消息,但一致性和性能较差不支持事务消息
顺序消息支持严格顺序消费,适合高并发场景支持分区内的顺序消费,但需要手动控制分区的数量和分布支持顺序消费,但通常不如 RocketMQ 强大支持顺序消费,但不如 RocketMQ 强大不强调顺序消息处理
延迟在高并发场景下延迟较低,适用于实时消息传递吞吐量优先,延迟相对较高在高负载时延迟较高延迟较高,尤其在负载较重时延迟极低,适用于实时性要求较高的场景
适用场景高吞吐量、大规模分布式系统、事务消息、顺序消息等场景日志聚合、流数据处理、大数据平台企业消息传递、支持 AMQP 协议的系统中小规模企业消息传递、企业级应用实时数据流、IoT、微服务架构等高性能、低延迟场景
社区与生态Apache 社区支持,活跃且发展迅速Apache 社区支持,社区活跃社区活跃,广泛应用于企业级应用Apache 社区支持,但活跃度和扩展性相对较弱开源社区活跃,适用于微服务和高并发场景

总结

  • RocketMQ 在高吞吐量、低延迟和事务消息支持方面表现出色,适用于金融、电商等高并发、高可靠的场景。
  • Kafka 强调吞吐量,适用于大数据流处理、日志聚合等大规模数据平台,且具有较好的扩展性。
  • RabbitMQ 适用于中小规模企业,特别是需要支持多协议(如 AMQP)的消息传递应用。
  • ActiveMQ 相对较为传统,适合于小到中规模的企业应用,支持多协议但性能和扩展性较差。
  • NATS 轻量级、高性能,适用于实时性要求较高的场景,如物联网、微服务架构等。

五、应用场景

以下是一些典型的 RocketMQ 应用场景

  1. 金融行业
  • 交易消息系统:金融交易系统对消息的可靠性、事务性和高吞吐量有严格要求。RocketMQ 支持事务消息(Transaction Message),能够确保分布式事务的准确性,适合在银行、电商金融、支付系统中进行实时交易消息处理。
  • 风控系统:在金融风控系统中,常常需要高并发、高吞吐量的消息系统来处理海量数据。RocketMQ 的高吞吐量和低延迟特性使其适用于此类实时风控决策系统。
  • 资金调度:资金调度的核心需求是可靠性与高吞吐量,RocketMQ 能够在大规模并发请求下保证数据一致性,适合资金结算、账户调度等高并发场景。
  1. 电商平台
  • 订单处理系统:电商平台中的订单生成、支付、库存管理、物流等环节常常需要保证高并发、高吞吐量的消息传递。RocketMQ 能够保证系统的高效性,特别是在“双十一”等促销活动期间,能够平稳处理海量订单消息。
  • 异步消息处理:电商系统中,很多操作是异步的,例如支付回调、库存扣减、物流派送等。使用 RocketMQ 可以通过消息队列解耦这些操作,提高系统响应速度。
  • 促销活动推送:对于电商平台的秒杀、优惠券发放等高频业务,RocketMQ 能够提供高并发支持,保证消息的顺序和稳定性。
  1. 大数据与流处理
  • 日志收集与分析:RocketMQ 可以高效地处理海量的日志数据,支持从各类应用程序、服务器、设备等收集日志并进行实时处理。与 FlumeLogstash 等流式处理框架配合使用,能够快速地收集、传输和分析日志数据。
  • 数据流处理:在实时数据流的场景中,如实时大数据处理、数据分析、机器学习等,RocketMQ 能够以极低的延迟和高吞吐量确保数据的稳定传输,适用于大数据平台和流计算架构。
  1. 微服务架构
  • 微服务通信:在微服务架构中,服务之间通常通过异步消息传递进行解耦。RocketMQ 提供可靠的消息投递机制,可以保证服务间的数据一致性,避免系统耦合过紧。通过 RocketMQ,服务间的通信能够更加灵活、可靠。
  • 异步处理与事件驱动:RocketMQ 作为事件驱动架构(EDA)中的核心组件,能够很好地支持微服务中的异步处理和事件发布与订阅模式。事件驱动模型适用于需要处理高并发、低延迟业务的微服务系统。
  1. 物联网(IoT)
  • 设备数据收集与处理:在物联网应用中,设备的数量庞大,产生的数据量巨大,且对实时性要求较高。RocketMQ 的高吞吐量、低延迟和高可靠性非常适合用于 IoT 系统中,能够实时收集来自各类设备的数据并进行分发处理。
  • 状态监控和告警系统:RocketMQ 能够支持设备的状态数据流转,以及实时告警通知。通过将设备数据发送到消息队列中,再进行实时分析和处理,能够在出现异常时及时触发告警。
  1. 实时消息推送
  • 社交平台消息推送:在社交平台中,实时消息推送是一项核心功能,如聊天消息、通知、点赞、评论等,RocketMQ 具备高吞吐量和低延迟的特点,能够保证大规模用户的实时消息推送。
  • 内容分发网络(CDN) :RocketMQ 可以帮助构建高效的内容分发和通知系统,推送实时更新、推荐内容等,确保数据在多个节点之间快速传递,特别适用于需要快速内容更新的场景。
  1. 日志与事件追踪
  • 异步日志记录:许多应用系统会在后台记录用户操作、系统运行状态等信息。RocketMQ 可以异步记录日志,避免同步阻塞,同时保证高效的日志传输和存储,尤其适合大规模分布式系统的日志收集。
  • 事件追踪与分析:在微服务架构中,事件追踪(如调用链追踪)对于监控和故障排查至关重要。RocketMQ 可以确保事件流的高效传递和顺序处理,帮助构建全面的事件追踪系统。
  1. 消息驱动的异步任务
  • 后台任务处理:很多系统的任务是异步的,如生成报表、邮件发送、数据处理等。使用 RocketMQ 进行任务调度和消息驱动处理,可以有效解耦主业务流程和耗时的任务处理,提高系统的响应能力。
  • 定时任务与延时消息:RocketMQ 支持延时消息功能,可以用来处理定时任务、超时重试等操作。比如在电商场景中,发货时间的计算、延时支付的重试等都可以通过 RocketMQ 延时消息机制来实现。
  1. 日志与审计系统
  • 审计日志收集:在许多业务中,审计日志的收集与处理具有重要意义,特别是在合规性要求较高的行业(如金融、医疗等)。RocketMQ 可以作为日志收集的中间件,确保日志的可靠传输与持久化。
  1. 分布式系统与高可用架构
  • 系统解耦与弹性扩展:在复杂的分布式系统中,RocketMQ 可以通过消息队列解耦各个服务模块,保证系统的可靠性和高可用性。尤其是在微服务架构中,消息中间件可以减少服务间的直接依赖,提高系统的扩展性和容错能力。

场景示例1—异步解耦

随着微服务架构的流行,服务之间的关系梳理非常重要。异步解耦可以降低服务之间的耦合程度,同时也能提高服务的吞吐量。

使用异步解耦的业务场景非常多,因为每个行业的业务都会不太一样,以一些比较通用的业务来说明相信大家都能理解。

比如电商行业的下单业务场景,以最简单的下单流程来说,下单流程如下:

  1. 锁库存
  2. 创建订单
  3. 用户支付
  4. 扣减库存
  5. 给用户发送购买短信通知
  6. 给用户增加积分
  7. 通知商家发货

我们以下单成功后,用户进行支付,支付完成会有个逻辑叫支付回调,在回调里面需要去做一些业务逻辑。首先来看下同步处理需要花费的时间,如下图:

膜拜!看完这篇你还不懂RocketMQ算我输

同步流程

上面的下单流程从 3 到 5 都是可以采用异步流程进行处理,对于用户来说,支付完成后他就不需要关注后面的流程了。后台慢慢处理就行了,这样就能简化三个步骤,提高回调的处理时间。

膜拜!看完这篇你还不懂RocketMQ算我输

异步流程

场景示例2—削峰填谷

削峰填谷指的是在大流量的冲击下,利用 RocketMQ 可以抗住瞬时的大流量,保护系统的稳定性,提升用户体验。

在电商行业,最常见的流量冲击就是秒杀活动了,利用 RocketMQ 来实现一个完整的秒杀业务还是与很多需要做的工作,不在本文的范围内,后面有机会可以单独跟大家聊聊。想告诉大家的是像诸如此类的场景可以利用 RocketMQ 来扛住高并发,前提是业务场景支持异步处理

膜拜!看完这篇你还不懂RocketMQ算我输

削峰填谷

场景示例3—分布式事务最终一致性

众所周知,分布式事务有 2PC,TCC,最终一致性等方案。其中使用消息队列来做最终一致性方案是比较常用的。

在电商的业务场景中,交易相关的核心业务一定要确保数据的一致性。通过引入消息队列 RocketMQ 版的分布式事务,既可以实现系统之间的解耦,又可以保证最终的数据一致性。

场景示例4—数据分发

数据分发指的是可以将原始数据分发到多个需要使用这份数据的系统中,实现数据异构的需求。最常见的有将数据分发到 ES, Redis 中为业务提供搜索,缓存等服务。

除了手动通过消息机制进行数据分发,还可以订阅 Mysql 的 binlog 来分发,在分发这个场景,需要使用 RocketMQ 的顺序消息来保证数据的一致性。

膜拜!看完这篇你还不懂RocketMQ算我输

数据分发

六、RocketMQ 组件

RocketMQ 的架构主要包括以下几个核心组件:

  1. NameServer
    NameServer 是一个轻量级的服务发现模块,负责管理 Broker 节点的元数据,帮助 Producer 和 Consumer 查找 Broker,类似于一个服务注册与发现中心。
  2. Broker
    Broker 是消息的存储和转发节点,消息生产者将消息发送到 Broker,消费者从 Broker 中拉取消息。Broker 负责消息的持久化存储、顺序消费和消息的投递。
  3. Producer
    Producer 是消息生产者,负责将消息发送到指定的 Topic。每个 Producer 可以连接多个 Broker,发送消息到不同的队列。
  4. Consumer
    Consumer 是消息消费者,负责从 Broker 拉取消息进行消费。Consumer 可以是 推模式(Push)或 拉模式(Pull),支持异步或同步消费。
  5. Admin Console
    RocketMQ 提供了管理控制台,用于监控和管理集群的状态、Topic、Consumer 以及消息的流量等信息。

七、消息传递流程

  1. Producer 发送消息
    Producer 将消息发送到 RocketMQ 的 Broker,并通过 NameServer 找到目标 Broker。消息被分配到一个队列(Queue),可以是顺序队列或并发队列。
  2. 消息存储
    Broker 接收到消息后会将其持久化到磁盘中,并且根据需要将消息复制到其他副本节点,保证高可用性。
  3. Consumer 拉取消息
    消费者(Consumer)从 Broker 拉取消息进行消费。RocketMQ 支持按 消息队列(Queue)消息主题(Topic) 进行消费,可以配置多种消费策略和消费并发度。
  4. 消息确认和重试
    消费者确认消息消费成功后,RocketMQ 会将消息从队列中删除;如果消费失败,消息会进入重试队列,按配置重试消费。

ba37ca06-a3f1-4b7f-a03f-d240a586502e

通过本文的介绍,我们可以看到 RocketMQ 作为一款高效的分布式消息中间件,无论你是正在考虑在项目中引入 RocketMQ,还是已经在使用它的开发者,掌握 RocketMQ 的核心特性和最佳实践对于提升系统的可靠性和性能至关重要。后续将分享RocketMQ的部署,及开发使用流程。

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

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

相关文章

基于信创环境的信息化系统运行监控及运维需求及策略

随着信息技术的快速发展和国家对信息安全的日益重视,信创环境(信息技术应用创新环境)的建设已成为行业发展的重要趋势。本指南旨在为运维团队在基于信创环境的系统建设及运维过程中提供参考,确保项目顺利实施并满足各项技术指标和…

初学 flutter 问题记录

windows搭建flutter运行环境 一、运行 flutter doctor遇到的问题 Xcmdline-tools component is missingRun path/to/sdkmanager --install "cmdline-tools;latest"See https://developer.android.com/studio/command-line for more details.1)cmdline-to…

【虚拟机】VMWare的CentOS虚拟机断电或强制关机出现问题

VMware 虚拟机因为笔记本突然断电故障了,开机提示“Entering emergency mode. Exit the shell to continue.”,如下图所示: 解决方法:输入命令: xfs_repair -v -L /dev/dm-0 注:报 no such file or direct…

设计模式:6、装饰模式(包装器)

目录 0、定义 1、装饰模式包含的四种角色 2、装饰模式的UML类图 3、示例代码 0、定义 动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。 1、装饰模式包含的四种角色 抽象组件(Component):抽象组件是一个抽象…

Java开发经验——Spring Test 常见错误

摘要 本文详细介绍了Java开发中Spring Test的常见错误和解决方案。文章首先概述了Spring中进行单元测试的多种方法,包括使用JUnit和Spring Boot Test进行集成测试,以及Mockito进行单元测试。接着,文章分析了Spring资源文件扫描不到的问题&am…

Java基于Spring Boot框架的房屋租赁系统,附源码

博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…

单片机_简单AI模型训练与部署__从0到0.9

IDE: CLion MCU: STM32F407VET6 一、导向 以求知为导向,从问题到寻求问题解决的方法,以兴趣驱动学习。 虽从0,但不到1,剩下的那一小步将由你迈出。本篇主要目的是体验完整的一次简单AI模型部署流程&#x…

Java-08 深入浅出 MyBatis - 多对多模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatis&#xff…

IDEA使用tips(LTS✍)

一、查找项目中某个外部库依赖类的pom来源 1、显示图 2、导出Maven 项目依赖的可视化输出文件 3、点击要查找的目标类,项目中定位后复制依赖名称 4、在导出的依赖的可视化文件中搜索查找 5、综上得到,Around类来自于pom中的spring-boot-starter-aop:jar…

【LLM训练系列02】如何找到一个大模型Lora的target_modules

方法1:观察attention中的线性层 import numpy as np import pandas as pd from peft import PeftModel import torch import torch.nn.functional as F from torch import Tensor from transformers import AutoTokenizer, AutoModel, BitsAndBytesConfig from typ…

如何选择服务器

如何选择服务器 选择服务器时应考虑以下几个关键因素: 性能需求。根据网站的预期流量和负载情况,选择合适的处理器、内存和存储容量。考虑网站是否需要处理大量动态内容或高分辨率媒体文件。 可扩展性。选择一个可以轻松扩展的服务器架构,以便…

C++共享智能指针

C中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄漏。解决这个问题最有效的方式是使用智能指针。 智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动…

python Flask指定IP和端口

from flask import Flask, request import uuidimport json import osapp Flask(__name__)app.route(/) def hello_world():return Hello, World!if __name__ __main__:app.run(host0.0.0.0, port5000)

虚幻引擎---初识篇

一、学习途径 虚幻引擎官方文档:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/unreal-engine-5-5-documentation虚幻引擎在线学习平台:https://dev.epicgames.com/community/unreal-engine/learning哔哩哔哩:https://www.b…

Java开发经验——SpringRestTemplate常见错误

摘要 本文分析了在使用Spring框架的RestTemplate发送表单请求时遇到的常见错误。主要问题在于将表单参数错误地以JSON格式提交,导致服务器无法正确解析参数。文章提供了错误案例的分析,并提出了修正方法。 1. 表单参数类型是MultiValueMap RestControl…

oracle会话追踪

一 跟踪当前会话 1.1 查看当前会话的SID,SERIAL# #在当前会话里执行 示例: SQL> select distinct userenv(sid) from v$mystat; USERENV(SID) -------------- 1945 SQL> select distinct sid,serial# from v$session where sid1945; SID SERIAL# …

数据可视化复习2-绘制折线图+条形图(叠加条形图,并列条形图,水平条形图)+ 饼状图 + 直方图

目录 目录 一、绘制折线图 1.使用pyplot 2.使用numpy ​编辑 3.使用DataFrame ​编辑 二、绘制条形图(柱状图) 1.简单条形图 2.绘制叠加条形图 3.绘制并列条形图 4.水平条形图 ​编辑 三、绘制饼状图 四、绘制散点图和直方图 1.散点图 2…

postgresql按照年月日统计历史数据

1.按照日 SELECT a.time,COALESCE(b.counts,0) as counts from ( SELECT to_char ( b, YYYY-MM-DD ) AS time FROM generate_series ( to_timestamp ( 2024-06-01, YYYY-MM-DD hh24:mi:ss ), to_timestamp ( 2024-06-30, YYYY-MM-DD hh24:mi:ss ), 1 days ) AS b GROUP BY tim…

【JavaEE初阶 — 多线程】定时器的应用及模拟实现

目录 1. 标准库中的定时器 1.1 Timer 的定义 1.2 Timer 的原理 1.3 Timer 的使用 1.4 Timer 的弊端 1.5 ScheduledExecutorService 2. 模拟实现定时器 2.1 实现定时器的步骤 2.1.1 定义类描述任务 定义类描述任务 第一种定义方法 …

一文学会Golang里拼接字符串的6种方式(性能对比)

g o l a n g golang golang的 s t r i n g string string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去。主要有以下几种拼接方式 拼接方式介绍 1.使用 s t r i n g string string自带的运算符 ans ans s2. 使用…