自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

专注于技术分享

人个目前就职于一家外企业500强公司担任架构师一职,在这里我会着重分享我多年来在Java开发领域的实战经验和心得体会。从企业级项目架构设计、高并发处理到微服务架构的落地实施。

  • 博客(692)
  • 资源 (19)
  • 收藏
  • 关注

原创 @PostMapping 之争:@RequestParam 与 @RequestBody 的深入解析

总而言之,与和的选择取决于客户端发送数据的方式和数据的复杂性。适用于从 URL 查询参数或表单中获取简单的键值对数据,而则专注于处理请求主体中的复杂、结构化的数据,如 JSON,并将其无缝地转换为 Java 对象。理解并正确运用这两者,是构建高效、清晰的 Spring Boot 应用程序的关键一步。

2025-08-19 11:42:32 361

原创 kafka 发送消息有哪些模式?各自的应用场景是什么?

模式acks配置可靠性延迟吞吐量适用场景发后即忘acks=0最低最低最高日志收集、监控指标、用户行为分析同步发送acks=1(默认)较高适中适中大部分常规业务场景,如消息通知异步完全确认acks=all-1最高最高最低金融交易、核心订单系统、支付结算选择哪种模式,完全取决于具体的业务需求。开发者需要在可靠性、性能(吞吐量和延迟)之间做出权衡,选择最适合当前应用场景的发送模式。

2025-08-18 16:15:43 882

原创 kafka 生产者是如何发送消息的?

Kafka 生产者发送消息的过程是一个异步流程,旨在实现高吞吐量和可靠性。和。

2025-08-18 16:11:10 707

原创 Zookeeper 在 Kafka 中扮演了什么角色?

在 Apache Kafka 的早期架构中,ZooKeeper 扮演了分布式协调服务角色,负责管理和协调整个 Kafka 集群。尽管新版本的 Kafka 正在逐步移除对 ZooKeeper 的依赖,但在许多现有和较早的系统中,了解 ZooKeeper 的作用仍然非常重要。: Kafka 集群中的每个 Broker(节点)在启动时都会向 ZooKeeper 注册自己的信息,例如 IP 地址和端口。

2025-08-18 16:03:50 494

原创 kafka 中Offset 的作用是什么?它由谁来管理?

Offset 本身由 Broker 在消息写入时创建。而消费者消费进度的 Offset,则是由。

2025-08-13 20:05:10 844

原创 kafka 消费者组的概念是什么?它是如何实现消息的点对点和发布/订阅模式?

Kafka 消费者组(Consumer Group)是 Kafka 架构中的核心概念,它是一组共同协作来消费一个或多个主题(Topic)数据的消费者应用的集合。通过简单地为多个消费者实例配置相同的group.id,它们就组成了一个消费者组。这一巧妙的设计,使得 Kafka 能够灵活地支持两种经典的消息传递模型:点对点(队列模型)和发布/订阅模型。

2025-08-12 16:21:11 394

原创 kafka 消费者的主要职责是什么?

Kafka 采用由消费者主导的拉取模式,这使得消费者可以根据自身的处理能力来控制消息的消费速率,避免因服务端推送过快而导致消费者崩溃。与生产者类似,消费者在收到消息后,需要使用指定的反序列化器(Deserializer)将从 Broker接收到的字节数组转换回原始的键和值对象,以便应用程序进行处理。消费者需要有效处理工作负载,确保消费进度与生产者的写入进度之间的差距(即“延迟”Lag)保持在较低水平,这对于实时数据处理至关重要。

2025-08-12 16:16:39 274

原创 kafka 生产者的主要职责是什么?

如果未指定键,则会采用轮询(Round-robin)策略将消息均匀地分发到各个分区。消息通常包含主题(Topic)、分区(Partition,可选)、键(Key,可选)和值(Value)。从 Kafka 0.11 版本开始,通过启用幂等性(Idempotence),即使在发生重试的情况下,也能在分区内保证消息的顺序和精确一次(Exactly-once)的投递语义。它会在内部维护一个缓冲区(RecordAccumulator),将待发送的消息先缓存起来,然后将多条消息打包成一个批次(Batch)再统一发送。

2025-08-12 16:12:39 344

原创 kafka 中的Broker 是什么?它在集群中起什么作用?

它维护着关于Topic、分区、副本等状态的元数据,并通过与ZooKeeper(在较新版本中,也可以使用基于Raft的KRaft协议)的协调来保证集群中各个节点信息的一致性。总而言之,Broker是Kafka集群中不可或缺的组成部分,它通过分布式协作,共同承担了消息的存储、转发、高可用保障以及集群管理等多项关键任务,是Kafka实现高吞吐量、可扩展和高可靠性的基石。简单来说,每一个Broker就是运行着Kafka服务的一个实例,多台Broker共同协作,形成了强大的、可扩展的消息处理集群。

2025-08-11 18:54:41 512

原创 Spring Boot @Validated 和@Valid 区别

如果只需要简单的校验,不涉及复杂的分组场景,使用@Valid就足够了。当需要根据不同的业务场景应用不同的校验规则时,@Validated的分组功能是最佳选择。在进行嵌套对象校验时,务必在嵌套对象的字段上使用@Valid注解。若要校验或这类方法参数,需要在对应的类上标注@Validated注解。

2025-08-11 10:45:13 1239

原创 kafka 副本机制是如何工作的?Leader 和 Follower 是什么角色?

例如,一个主题有 3 个分区,副本因子(Replication Factor)设置为 3,那么每个分区都会有 1 个 Leader 副本和 2 个 Follower 副本,整个主题总共就有。通过这套精心设计的副本机制、Leader/Follower 角色划分以及 ISR 列表,Kafka 在分布式环境下巧妙地平衡了高性能、高可用和数据一致性这三者之间的关系。的设计,简化了数据一致性的逻辑。因为所有读写操作都集中在 Leader 上,避免了分布式系统中常见的数据冲突和复杂的共识算法问题。

2025-08-09 11:37:54 828

原创 kafka 为什么需要分区?分区的引入带来了哪些好处

简单来说,Kafka 之所以需要分区,最根本的原因是为了实现可伸缩性(Scalability)和高吞吐量(High Throughput)。一个没有分区的 Topic 就像一条单行道,所有的车(数据)都必须排成一队依次通过,其处理能力会受限于单个服务器(Broker)的磁盘 I/O 和网络带宽。而引入分区,就相当于将这条单行道拓宽成了多条并行的高速车道,极大地提升了通行能力。这是分区最主要的好处。分区是实现并行消费的关键。例如,一个订单系统,可以将订单消息分散到 10 个分区。在处理高峰期,可以启动 10

2025-08-08 16:40:49 969

原创 在 Mac 上安装 IntelliJ IDEA

在 Mac 上安装 IntelliJ IDEA 步骤。下面我将提供两种最主流的安装方法,并附上详细的图文解说式步骤。

2025-08-08 14:59:02 1019

原创 Topic 在 Kafka 中扮演什么角色?它与传统消息队列中 Queue 的区别?

在 Kafka 中,扮演着至关重要的角色,它是消息的逻辑分类和组织单元。你可以把它想象成数据库中的表,或者是文件系统中的文件夹。生产者将消息发布到特定的主题,而消费者则通过订阅主题来接收消息。

2025-08-06 16:13:53 1072

原创 什么是 Kafka 中的消息?它由哪些部分组成

在 Apache Kafka 中,消息是其核心数据单元,是生产者(Producer)和消费者(Consumer)之间传递信息的载体。它是一个分布式的流处理平台,旨在提供高吞吐量、可扩展和可靠的消息系统。每一条发布到 Kafka 集群的消息都有一个类别,这个类别被称为主题(Topic)。

2025-08-06 16:11:15 333

原创 mongoTemplate 根据地理位置查询指定范围内的目标

首先,我们需要创建一个实体类(@Document)来存储地理位置信息。推荐使用类型,这是 Spring Data MongoDB 提供的标准方式,它会被映射为 MongoDB 的 GeoJSON 格式。假设我们有一个“商店”实体,需要存储其位置信息。@Document(collection = "stores") // 指定集合名称@Id// 关键字段:用于存储地理位置坐标// 格式为 [经度, 纬度]// 构造函数、Getter 和 Setterreturn id;

2025-08-04 15:08:14 842

原创 MongoTemplate中setOnInsert与set方法的深度解析

总的来说,set和为在中执行upsert方法描述使用场景set()无论文档是插入还是更新,都设置或更新指定的字段。需要对字段进行常规更新,不论其是否存在。仅在upsert操作插入新文档时设置指定的字段。为新创建的文档设置创建时间、初始状态、默认值等一次性属性。

2025-08-04 10:53:24 770

原创 kafka与其他消息队列(如 RabbitMQ, ActiveMQ)相比,有什么优缺点?

Kafka、RabbitMQ 和 ActiveMQ 是三种最主流的消息中间件,它们的设计和适用场景有所不同。现在,我们来深入探讨 Kafka 相对于另外两者的具体优缺点。

2025-08-03 16:20:10 815

原创 kafka 是一个怎样的系统?是消息队列(MQ)还是一个分布式流处理平台?

你把信投进去,收信人取走信件后,信箱就空了。它的主要功能是“传递”。新的记录(事件)被源源不断地添加进来,并且按照时间顺序整理归档(持久化日志)。任何有权限的人(消费者)都可以随时来查阅这些档案(非破坏性读取)。张三可以来查阅昨天的档案,李四可以同时来查阅上周的档案(多消费者独立消费)。图书馆还提供了复印机(Kafka Connect)和阅览室/研究工具(Kafka Streams),让你不仅能查阅,还能在馆内直接对这些档案进行处理和分析。因此,

2025-08-03 16:16:42 566

原创 Kafka 是什么?

Kafka 是一个开源的分布式事件流处理平台。Kafka 的设计目标是为处理实时数据流提供一个统一的、高吞吐量、低延迟的平台。从本质上讲,可以将 Kafka 理解为一个高度可靠且可扩展的“日志”或“记录簿”,用于记录在不同系统和应用程序之间发生的“事件”。凭借其高性能和可扩展性,Kafka 被广泛应用于各种场景,超过 80% 的财富 500 强公司都在使用它。总而言之,Kafka 不仅仅是一个消息队列,它更是一个功能强大的分布式事件流平台,为构建数据驱动的实时应用程序提供了坚实的基础。

2025-08-03 16:10:03 554

原创 在多租户或多服务共享 Redis 时,如何做逻辑隔离或权限控制?

在多租户或多服务共享一个 Redis 实例时,进行有效的逻辑隔离和权限控制至关重要,以确保数据的安全性和独立性。以下是实现这一目标的几种关键策略,从简单到复杂,可以单独或组合使用。

2025-08-01 16:09:05 1545

原创 如何保护 Redis 实例的安全?

保护 Redis 实例的安全是一个持续的过程,需要综合运用多种安全措施。通过实施网络隔离、配置强密码和 ACL、禁用危险命令、以低权限用户运行以及加密数据传输,您可以显著提高 Redis 实例的安全性,有效防范各种潜在威胁,保障数据的安全和服务的稳定运行。定期审查和更新安全策略,并及时关注 Redis 的安全漏洞公告,也是确保长期安全的关键。Redis 作为一种高性能的内存数据存储,广泛应用于缓存、消息队列和会话管理等场景。默认情况下,Redis 客户端和服务器之间的通信是明文的,容易被网络嗅探。

2025-08-01 16:05:03 826

原创 如何将 Redis 监控集成到微服务整体的监控体系中( 如 Prometheus + Grafana)

注解,并且你的 Prometheus 是通过官方的 Helm Chart 或 Prometheus Operator 部署的,那么它会自动发现并开始抓取这个 Service 的指标,无需手动修改配置。通过以上四个步骤,你就可以成功地将 Redis 监控无缝集成到微服务整体的 Prometheus + Grafana 监控体系中,实现对 Redis 性能、内存、连接数等关键指标的全面可视化和自动化告警。你需要在你的 Redis 实例旁边部署 Redis Exporter。部署方式取决于你的环境。

2025-07-31 09:41:45 830

原创 生产环境需要监控 Redis 的哪些关键指标?

在生产环境中监控 Redis 对于确保系统稳定性和性能至关重要。全面的监控应涵盖性能、内存、客户端活动、持久化、复制和错误等多个维度。通过对这些关键指标的持续监控和告警,可以及时发现并解决潜在问题,保障生产环境中 Redis 服务的稳定、高效运行。延迟和吞吐量是关键的性能指标。对于需要数据持久化的场景,监控 RDB 和 AOF 的状态至关重要。Redis 是一个基于内存的数据库,因此内存监控至关重要。监控客户端连接有助于了解和管理对 Redis 的访问。在主从复制架构中,确保数据同步的可靠性是关键。

2025-07-31 09:34:28 784

原创 Mac 上配置jdk 环境变量

核心步骤是设置JAVA_HOME变量,并将其bin目录添加到系统的PATH变量中。macOS 从 Catalina (10.15) 版本开始,默认的终端 Shell 从bash切换到了zsh。因此,你需要先确定你正在使用的 Shell,然后编辑对应的配置文件。

2025-07-30 17:11:09 1072

原创 如何利用 Redis 的原子操作(INCR, DECR)实现分布式计数器?

利用 Redis 的INCR和DECR原子操作是实现分布式计数器的标准且高效的方法。其核心优势在于 Redis 保证了单个命令的原子性,从而避免了分布式环境下的竞态条件。对于需要自动重置的计数器,强烈建议使用 Lua 脚本来确保操作的原子性,防止数据不一致。

2025-07-30 11:26:36 1069

原创 如何使用 Redis 实现 API 网关或单个服务的请求限流?

使用 Redis 实现请求限流是一种高效且可扩展的方案。开发者应根据具体的业务场景和需求选择合适的限流算法。对于简单的限流需求,固定窗口计数器是一个不错的起点。为了更精确地控制流量并避免边界问题,滑动窗口日志或滑动窗口计数器是更好的选择。如果需要应对突发流量,令牌桶算法则非常适用。在实施时,务必使用Lua 脚本来保证操作的原子性,避免在并发环境下出现数据不一致的问题。将限流逻辑部署在API 网关层可以对整个系统起到保护作用,而部署在单个服务层则提供了更高的灵活性。

2025-07-30 09:42:45 910

原创 使用redis 作为消息队列时, 如何保证消息的可靠性

通过结合使用Redis的持久化、高可用架构以及Streams提供的消费者组和手动确认机制,可以构建一个高度可靠的消息队列系统。然而,Redis本质上是一个内存数据库,若要将其用作可靠的消息队列,必须采取一系列措施来确保消息的可靠性,防止消息丢失。通过部署Redis的主从复制或者哨兵(Sentinel)集群,可以实现当主节点故障时,自动切换到从节点,从而保证消息队列服务的连续性。同一个组内的多个消费者可以协同消费同一个流中的消息,每个消费者会消费流中的不同消息。:这是保证消息不丢失的关键。

2025-07-29 14:30:11 1099 1

原创 python 同样是循环一个列表,为什么列表推导式(List Comprehension)比 for 循环更好?

特性列表推导式 (List Comprehension)for循环 (For Loop)核心用途从一个可迭代对象创建新列表通用的循环结构,可执行任何操作语法简洁、一行完成冗长,需要多行代码性能通常更快(针对创建列表)较慢(因 Python 级别的函数调用)可读性对于简单逻辑非常高对于复杂逻辑更清晰编程范式声明式(“我想要什么”)指令式(“该怎么做”)当你的目标是基于一个已有的可迭代对象,通过简单的转换和筛选来创建一个新的列表时,应该优先选择列表推导式。它更高效、更简洁。

2025-07-29 14:21:25 627

原创 python 为什么要用 with open(...) as f: 这种写法?它比 f = open(...) 然后 f.close() 好在哪里?

with语句之所以能实现自动管理,是因为文件对象实现了“上下文管理协议”,即它拥有和__exit__()这两个特殊方法。当进入with语句块时,方法被调用,它负责准备资源(例如打开文件)并返回该资源(文件对象f当代码块执行结束或因任何原因退出时,__exit__()方法会被自动调用,它负责执行清理工作(例如关闭文件)。总结特性f.close()资源关闭必须手动调用close()自动关闭,无需手动操作异常安全默认不安全,需要配合天生安全,能保证在异常时也关闭资源代码简洁性冗长,尤其是使用时非常简洁。

2025-07-29 14:16:50 365

原创 领域驱动设计(DDD)如何划分核心域、支撑子域和通用子域?

子域通常被划分为核心域、支撑子域和通用子域三种类型,这种划分有助于团队明确业务重点,从而合理分配资源和制定不同的开发策略。支撑子域对于实现核心域的功能是必不可少的,但它们本身并不是企业的核心竞争力。这类子域通常具有一定的业务特性,但又不具备通用性,市场上可能没有现成的解决方案,需要自行开发。它直接关系到企业的成功和盈利能力,是企业独有的、区别于竞争对手的关键业务。识别核心域是进行子域划分的首要任务。通用子域提供的是在多个业务领域中都通用的功能,这些功能通常有成熟的解决方案或可以购买第三方服务。

2025-07-28 17:47:53 426

原创 python 如何自定义一个异常?在什么情况下需要这样做?

它向用户清晰地表明我们的库可能会抛出哪些特定于其领域的错误,并允许他们以可控的方式处理这些错误。在 Python 中,自定义异常是一种强大的工具,它允许开发者创建专有的错误类型,从而使代码更具可读性、可维护性,并能更精确地处理特定的错误情况。可以定义一个基础的自定义异常,然后创建更具体的子类异常。这使得异常处理更加灵活,因为我们可以选择捕获整个异常层次结构中的任何级别的异常。当应用程序或库有其特定的错误条件时,使用自定义异常可以使代码的意图更加清晰。自定义异常允许在特定的错误情况下编写专门的处理逻辑。

2025-07-28 17:12:23 511

原创 python try...except...finally 块的执行逻辑是怎样的?

场景tryexceptelsefinally最终结果无异常执行跳过执行执行正常执行有异常,被捕获执行至异常处执行跳过执行异常被处理,继续执行有异常,未捕获执行至异常处跳过跳过执行异常向上传播。

2025-07-28 13:43:15 478

原创 python 如何优雅地处理错误而不是直接退出?

当内置的异常类型无法准确描述你的应用中特定的错误情况时,可以创建自定义异常。定义自定义异常通过继承内置的Exception类来创建一个新的异常类。pass引发自定义异常在代码中检测到特定错误条件时,使用raise关键字引发你的自定义异常。raise MyCustomError("值不能为负数!")try:print(f"自定义错误:def some_function(value) : if value < 0 : raise MyCustomError("值不能为负数!

2025-07-28 13:40:22 383

原创 python 什么是模块(Module),什么是包(Package)?init.py 文件有什么用?

在 Python 中,模块(Module)和包(Package)是组织代码的两种重要方式,而文件则在包的定义中扮演着关键角色。

2025-07-28 13:36:24 454

原创 import 语句到底做了什么?Python 是如何找到我想要导入的模块的?

import语句是 Python 中代码重用和模块化编程的核心。指定的模块,然后将搜索结果到当前作用域中的一个名称。以下是importimport。

2025-07-26 07:21:25 442

原创 python 中当我们的代码越来越多时,如何组织成多个文件?

对于大型项目,遵循标准的项目结构至关重要。这有助于新加入的开发人员快速理解代码库。最简单的方法是将代码拆分为多个 Python 文件,每个文件都称为一个模块。文件还可以用于执行包的初始化代码或定义包级别的变量。当项目变得更大时,可以将相关的模块组织成一个包。

2025-07-26 07:17:41 474

原创 python 什么时候应该用函数式编程,什么时候应该用面向对象?

场景主导范式理由构建应用框架、游戏、GUI面向对象 (OOP)需要对复杂的实体、状态和交互进行建模和封装。数据清洗、分析、科学计算函数式 (FP)核心是无状态的数据转换和处理流水线。Web 后端开发 (如 Django/Flask)混合模式使用类来定义模型和视图 (OOP),在视图函数或方法内部处理请求数据 (FP)。编写一个简单的工具脚本过程式或函数式任务简单,无需复杂的结构,直接用函数组织即可。从 OOP 开始构建你的程序结构,因为这在 Python 中更为主流和直观。

2025-07-24 17:07:56 746

原创 微服务架构需要支持哪些核心业务目标?

在规划微服务架构时,必须清晰的定义它支持哪些核心业务目标。这些目标将指导架构设计中的关键决策,例如服务如何拆分、采用何种通信模式、以及对可靠性和性能的要求级别等。如果仅仅为了技术而技术,而没有明确的业务目标驱动,那么引入微服务架构的复杂性可能弊大于利。微服务架构本身是一种技术手段,它的最终目的是要服务于。

2025-07-24 11:44:37 381

原创 python 如何将真实世界的概念(比如“人”、“车”)抽象成代码?

_init__现在我们来添加“人”能做的事,比如“自我介绍”。我们定义一个普通的方法。注意,方法的第一个参数必须是self,这样方法才能知道是哪个对象在调用它,从而访问该对象的属性。# ---- 属性 (Attributes) ----# ---- 行为 (Methods) ----# 这个方法可以访问对象自己的属性 (self.name, self.age)print(f"大家好,我叫。

2025-07-24 11:42:54 402

消息中间件常见面试题汇总

消息中间件常见面试题汇总

2025-03-12

RocketMQ 的安装与源码调试指南

RocketMQ 的安装与源码调试指南

2025-03-12

RocketMQ5安装与集群搭建

RocketMQ5安装与集群搭建

2025-03-12

年终述职模版合集(简约风格)

年终述职模版合集

2025-01-14

毕业论文标准模版使用技巧

毕业论文标准模版

2025-01-14

gradle 8.11版本

gradle 8.11版本

2025-01-13

mongo windows 命令行工具

mongo windows 命令行工具

2025-01-13

DMS windows版本

DMS windows版本

2025-01-07

nacos-server:2.2.3源码

nacos-server:2.2.3源码

2025-01-07

Word排版技巧

对 Word 进行页面调整,通常大家采用的方法是选择“文件→页面设置”,其实还有别的方法

2013-01-17

android 开发中用json解析客户端与服务器端的代码

游戏开发中客户端与服务器端数据的传输, URL url = new URL(path); //创建一个Url对象 //得到打开的链接对象 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置请求超时与请求方式 conn.setReadTimeout(5*1000); conn.setRequestMethod("GET"); //从链接中获取一个输入流对象 InputStream inStream = conn.getInputStream(); //调用数据流处理方法 byte[] data = StreamTool.readInputStream(inStream); String json = new String(data); //构建Json数组对象 JSONArray array = new JSONArray(json); //从Json数组对象读取数据

2011-09-26

android 中 ViewPager 与scrollView 冲突的解决

获取ViewPager 与 ScrollView 冲突事件的解决

2014-04-18

jackson-all-1.8.1.jar 包的下载

可以方便的把java 对象转换成json格式的数据

2013-11-25

andorid 开发USB 延长线与结点通信PC驱动

android 开发中,USB延长线连接开发板与PC之间的驱动

2013-01-17

androidasync-1.2.4.jar

使用androidasync-1.2.4.jar 包可方便的解析一些服务器端的数据格式

2014-02-17

fastjson-1.1.33.jar 下载

利用fastjson-1.1.33.jar 解析 json 数据

2014-01-11

android .9png 去黑边工具

android .9png 去黑边工具 xUltimate-d9pc-x86

2013-11-29

android switch 组件 4.0 以下的使用

android switch 组件 4.0 以下的使用

2014-01-11

三星pad(p6200)驱动

开发时一直找不到驱动,现在给大家分享一下,三星pad(p6200)驱动

2013-01-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除