- 博客(302)
- 资源 (5)
- 问答 (2)
- 收藏
- 关注
原创 Java代码实现RabbitMQ死信队列
死信队列的核心是给业务队列配置和,死信队列 / 交换机是普通的队列 / 交换机;死信触发的核心条件:消息过期、消费拒绝()、队列满;代码实现关键:手动 ACK + 拒绝消息时,或配置消息 / 队列 TTL。这套代码覆盖了死信队列的核心场景,你可以直接复制运行,只需确保本地 RabbitMQ 服务正常启动即可。
2026-01-10 19:13:19
391
原创 Rabbit MQ中@Exchange(durable = “true“) 和 @Queue(durable = “true“) 有什么区别
注解配置核心作用保证交换机本身在 RabbitMQ 服务器重启后不丢失(交换机的元数据持久化)。保证队列本身在 RabbitMQ 服务器重启后不丢失,且队列内的「持久化消息」也会保留(队列 + 消息存储持久化)。保障交换机本身不丢失,是消息能进入 MQ 的前提;保障队列本身不丢失,且是消息持久化到磁盘的前提;生产环境中必须两者都配置为true,再配合生产者的「消息持久化」配置,才能真正保证 MQ 重启后消息不丢失。简单记:交换机持久化保「入口」,队列持久化保「存储」,两者缺一不可。
2026-01-10 18:16:36
560
原创 Rabbit MQ是如何保证消息不丢失的?
生产者侧:开启,携带追踪消息,失败则重试 / 入库兜底;MQ 服务端:通过注解配置实现交换机 / 队列持久化,消息设置为PERSISTENT持久化存储;消费者侧:开启手动 ACK,配置消费重试和死信队列,确保处理完成后才确认,失败则兜底到死信队列。这一套组合拳能覆盖 99% 的生产场景,确保消息端到端不丢失。(持久化)、(手动 ACK)、(生产者确认)。
2026-01-10 18:07:19
567
原创 RabbitMQ Exchange Headers类型存在的意义?
日常场景:优先选 Direct(精确匹配)、Fanout(广播)、Topic(通配符匹配),Headers 完全可以不用;特殊场景:只有当路由规则需要「非字符串类型属性匹配」「数值 / 布尔的范围组合匹配」「隐藏路由规则」「兼容遗留系统」时,Headers 交换机才是更优解;核心原则:Headers 是「补充型」交换机,而非「主流型」—— 只有当其他交换机无法优雅实现需求时,再考虑它。
2026-01-10 17:45:11
344
原创 Rabbit的4种Exchange
RabbitMQ 的交换机主要有四种类型:Direct、Fanout、Topic、Headers。1)Direct 交换机会根据消息的路由键(routing key)精确匹配绑定键(binding key),只有完全匹配的消息才会被转发到对应的队列。2)Fanout 交换机会将接收到的每一条消息广播到所有绑定到它的队列,而不考虑路由键。3)Topic 交换机会根据消息的路由键和绑定键的模式匹配(支持通配符)来决定消息的流转路径。可以匹配一个单词,可以匹配零个或多个单词。
2026-01-10 17:31:20
217
原创 注解实现rabbitmq消费者和生产者
生产者:必须知道(消息路由的必要条件),不需要知道 queue;消费者:核心只需要知道queue(监听队列拿消息),exchange和routingKey只是「自动声明绑定关系」时的附加配置,不是必需;里的routingKey是「交换机和队列的绑定规则」,不是消费者的消费规则 —— 只要队列已存在,消费者完全可以忽略 exchange 和 routingKey。生产环境建议:提前在 RabbitMQ 控制台 / 运维脚本创建好交换机、队列、绑定关系,消费者只通过监听队列,这样代码最简洁、耦合度最低。
2026-01-10 16:58:18
1108
原创 设计模式举例
提供接口创建一系列相关 / 依赖对象,无需指定具体类。java运行// 产品族接口// 具体产品(风格A)@Override public void sit() { System.out.println("坐现代椅子");@Override public void put() { System.out.println("放现代桌子");// 抽象工厂// 具体工厂(生产风格A)// 使用23 种设计模式各有适用场景,核心是 “解耦” 和 “复用”。
2025-10-19 13:56:31
621
1
原创 Flink 非确定有限自动机NFA
Flink 是一个用于状态化计算的分布式流处理框架,而非确定有限自动机(NFA, Non-deterministic Finite Automaton)是一种在计算机科学中广泛使用的抽象计算模型,常用于正则表达式匹配、模式识别等领域。Apache Flink 提供了对 NFA 的支持,特别是在复杂事件处理(CEP, Complex Event Processing)场景下。以下是与。
2025-05-19 17:50:09
710
原创 Flink 作业提交流程
阶段描述1. 客户端构建将用户代码转换为 StreamGraph → JobGraph2. 提交作业Client 提交到 JobManager3. 资源调度ResourceManager 分配 TaskManager Slot4. 任务执行TaskManager 启动 Subtask 并执行逻辑5. 状态管理Checkpointing 保障状态一致性6. 故障恢复重启失败任务并从 Checkpoint 恢复。
2025-05-18 22:31:40
1285
原创 Flink Table & SQL
- 定义带有事件时间的表ts BIGINT,WATERMARK FOR ts AS ts - 1000 -- 定义水印-- 使用滚动窗口进行统计SELECTuser,技术点描述Table API基于 Java/Scala 的函数式 APIFlink SQL支持 ANSI SQL,易于上手管理表和 SQL 的核心类Connectors支持 Kafka、Hive、JDBC、File、Print 等支持事件时间、处理时间Windowing支持滚动、滑动、会话窗口。
2025-05-18 20:47:22
1236
原创 什么是 Flink Pattern
Pattern是对一系列事件行为的描述规则,用来匹配流中符合某种顺序、条件或时间范围的事件组合。你可以用Pattern用户连续登录失败某个设备短时间内多次报警用户点击 A → B → C 的行为路径异常交易行为等功能说明行为识别如用户操作路径、漏斗转化率异常检测如频繁请求、登录失败、支付异常业务规则匹配如风控策略、营销活动触发条件流式规则引擎实时判断是否符合预设逻辑与 Flink 状态结合支持高并发、低延迟的状态化检测。
2025-05-18 19:54:28
607
原创 Flink CEP是什么?
CEP 是一种从连续的数据流中识别出符合预设模式(Pattern)的事件组合的技术。用户行为分析(如“登录 → 加入购物车 → 放弃支付”)异常检测(如“连续失败请求超过3次”)风控规则匹配(如“短时间内多次转账”)特性描述名称Flink CEP功能流式数据中识别事件模式输入无界流输出匹配到的事件组合适用场景用户行为分析、风控、安全审计等依赖库flink-cep或。
2025-05-18 19:47:30
783
1
原创 Flink 并行度的设置
层级用途是否推荐使用控制单个算子并行度✅✅✅ 强烈推荐用于关键路径优化设置默认并行度✅✅ 推荐作为基础配置动态设置并行度✅ 适合多环境部署全局兜底配置⚠️ 推荐配合其他方式使用。
2025-05-18 19:27:55
1354
原创 Flink 的状态机制
场景推荐状态类型存储方式无需按 key 分组的状态按 key 处理的数据流全局配置/规则共享Memory超大状态(GB级)RocksDB状态需要定期清理。
2025-05-18 18:57:38
1056
原创 Flink 的水印机制
问题解决方法乱序数据导致窗口计算不完整使用水印机制,设定最大乱序时间窗口迟迟不触发检查水印是否推进、调整乱序容忍度迟到数据丢失使用处理时间戳未提取使用提取事件时间。
2025-05-18 18:34:20
662
原创 Flink的时间问题
场景推荐时间类型是否推荐实时监控(容忍误差)✅精确统计、结果一致性要求高Event Time✅✅✅数据源无时间戳⚠️ 不推荐长期使用乱序数据处理✅✅✅数据延迟容忍✅✅✅。
2025-05-18 16:53:38
785
原创 Flink 的窗口机制
每隔固定的时间周期开启一个新的窗口。窗口之间不重叠。每收集固定数量的元素后触发一次窗口计算。不依赖时间,只依赖元素个数。窗口每隔一定时间“滑动”一次,窗口长度固定。窗口之间有重叠。每隔固定数量的元素滑动一次窗口,窗口长度也以元素个数为单位。窗口之间可以部分重叠。根据活动间隙(gap)来划分窗口。如果两个元素之间的时间差超过设定的 gap,则属于不同的窗口。窗口类型划分依据是否重叠触发条件示例滚动时间窗口时间否时间到达滚动计数窗口元素个数否数量达到。
2025-05-18 16:30:47
933
原创 Flink 的任务槽和槽共享
Task Slot是 TaskManager 提供的资源单位,代表一个独立的线程或资源隔离单元。每个Slot可以运行多个 SubTask(来自不同 JobVertex),但这些 SubTask 必须属于同一个 Job,并且可以共享 Slot。槽共享(Slot Sharing)是指多个 Operator 或 SubTask 可以运行在同一个 Slot 中。这是 Flink 优化资源利用的重要机制,避免为每个 Operator 单独分配 Slot。概念描述是否默认启用Task Slot。
2025-05-17 15:50:19
1161
原创 Flink 数据传输机制
组件作用影响因素缓存传输数据性能、吞吐、背压Serializer序列化/反序列化数据CPU、网络带宽决定数据流向并行度、数据分布流量控制机制下游处理速度Shuffle多并行任务间数据重分布网络 I/O、CPU 开销。
2025-05-17 15:39:21
1247
原创 Kafka是如何实现幂等性的??
Kafka通过幂等生产者机制确保每条消息在Partition中只被写入一次,即使在生产者重试发送的情况下也不会导致重复消息。启用幂等生产者需要设置。
2025-03-21 14:16:30
1102
原创 如何解决Kafka Rebalance引起的重复消费
在Kafka中,Rebalance(再平衡)是消费者组(Consumer Group)动态调整分区分配的过程。当消费者组中的成员发生变化(例如消费者加入或退出)、订阅的Topic分区数量变化、或者消费者长时间未发送心跳时,都会触发Rebalance。虽然Rebalance有助于负载均衡和容错,但它也可能导致重复消费的问题。以下是一些解决因Rebalance引起的重复消费问题的方法:默认情况下,Kafka消费者的 配置为 ,即自动提交Offset。这可能导致消息被处理前就提交了Offset,从而在Rebal
2025-03-19 16:08:27
1897
原创 Apache Avro 的向前和向后兼容
向后兼容是指新版本的 Schema 可以读取旧版本的数据。即使数据是按照旧版 Schema 生成的,新版 Schema 也能正确解析这些数据。向前兼容是指旧版本的 Schema 可以读取新版本的数据。即使数据是按照新版 Schema 生成的,旧版 Schema 也能正确解析这些数据。Apache Avro 的向前和向后兼容性使得模式演化更加灵活,能够适应业务需求的变化,同时保证系统的稳定性和数据的一致性。通过合理设计 Schema,开发者可以轻松实现模式的扩展和修改,而无需担心数据解析问题。
2025-03-18 13:34:58
628
原创 什么是Apache Avro?
是一个开源的数据序列化框架,主要用于高效的数据交换和存储。它由 Apache Hadoop 项目开发,广泛应用于大数据生态系统中(如 Hadoop、Kafka 等)。Avro 提供了一种紧凑、快速的二进制数据格式,同时支持丰富的数据结构和模式演化。Apache Avro 是一种功能强大的数据序列化工具,适用于大数据场景下的高效数据存储和传输。其紧凑的二进制格式、模式驱动的设计以及灵活的模式演化能力,使其成为现代分布式系统中的重要组件。
2025-03-18 13:33:51
1476
原创 JS变量先使用后定义
JavaScript 中的变量提升是指变量可以在声明之前使用。这意味着你可以在代码的任何地方声明变量,而无需担心它在声明之前的代码无法访问它。在JavaScript中,如果你尝试在使用一个变量之前没有定义它,你会遇到一个错误,因为JavaScript 遵循作用域的原则,变量只能在它的作用域内使用。在上面的例子中,虽然变量是在使用之后定义的,但由于变量提升,它在使用之前已经被声明了。是在函数内部定义和使用的,所以它不会影响到函数外部的代码。语句块内部定义和使用的,所以它在块外部是不可见的。
2024-03-14 18:14:51
607
原创 vue 修改props
来触发自定义事件并传递数据。如果要修改Props的值,需要先将其作为本地变量进行存储,然后再使用。这样就能够在子组件中修改Props的值了。方法,最终更新父组件的Prop值。事件,从而将新的值传递给父组件的。在Vue中,我们可以通过。
2024-03-14 16:31:39
1719
原创 Java代码实现B树和B+树
实现插入、查找和删除功能时,您需要遵循B树和B+树的规则并考虑它们的特点。具体而言,对于B树,您需要在插入和删除期间维护树的平衡状态,并注意分裂和合并节点的条件。对于B+树,您需要调整链接,以确保所有叶子节点都位于同一级别,同时将中间节点分隔开。key数组用于存储节点中的键,child数组用于存储指向该节点子节点的指针。B+树的节点类类似于B树节点类,但它们只包含键值和其对应的指针,不包含子节点。此外,B+树也需要使用链表来存储叶子节点,并使用叶子节点之间的链接以支持范围查询。
2023-05-12 15:23:07
739
原创 Java代码实现SOAP和REST接口工具类
SOAP(Simple Object Access Protocol)和REST(Representational State Transfer)是两种不同的Web服务通信协议,因此它们的接口工具类实现也有一些差异。需要注意的是,这些示例代码只实现了最基本的功能,实际使用时可能需要根据具体情况进行修改和扩展。同时还需要注意安全性和性能等方面的问题,例如SSL证书验证、连接池管理和结果缓存等。
2023-05-12 15:00:43
1555
原创 Java代码实现红黑树
该实现仅包含插入操作,其他基本操作,如删除、查找和遍历等可以通过类似的方式实现。在实际使用中,建议根据实际需要进行优化,例如添加节点数、维护树高度等。
2023-05-12 14:56:09
412
原创 ES6新特性
一、默认参数ES5的写法function method(param) { if (null == param) { param = "默认值"; }}ES6的写法function method(param = "默认值") {}二、字符串模板ES5的写法var a = "字符串";var b = "我是";var c = b + a + "!";ES6的写法let a = "字符串";let b = "我是";let c = `${b}${a}!`;三、多行
2022-02-18 10:26:38
218
1
原创 无限重置IDEA试用期的小脚本
1Reset the trial period of IDEA.vbsSet wsshell = CreateObject("WScript.Shell")Set filesys = CreateObject("Scripting.FileSystemObject")USERPROFILE = wsshell.ExpandEnvironmentStrings("%USERPROFILE%")APPDATA = wsshell.ExpandEnvironmentStrings("%AP...
2021-09-07 00:27:16
9741
4
原创 Python3 获取本地IP
# !/usr/bin/python3# coding: utf-8import osimport randomimport sysimport IPyimport certifiimport netifacesimport pycurldef list_ipv4_adapter(): mapping = {} gateways = netifaces.gateways() if netifaces.AF_INET in gateways: ...
2021-06-15 17:50:29
866
1
原创 Python3 使用指定网络适配器访问特定网址
# !/usr/bin/python3# coding: utf-8import pycurldef ping_to_website(website, interface): c = pycurl.Curl() try: c.setopt(pycurl.URL, website) c.setopt(pycurl.CAINFO, certifi.where()) # for https, also supported HTTP c..
2021-06-15 17:02:26
608
原创 Python3 判断IP是否属于某个网段
# !/usr/bin/python3# coding: utf-8import IPydef in_same_segment(ip, mask, addr): # Specifies whether the address is in the network segment if '' == addr.strip(): return True subnet = IPy.IP('%s/%s' % (ip, mask), make_net=True) .
2021-06-15 16:57:21
979
原创 Python3 判断IPv4网络适配器是否在运行
# !/usr/bin/python3# coding: utf-8import osimport sysdef is_adapter_up(ip): if 'win32' == sys.platform: cmd = 'ipconfig |findstr "%s"' # Using `ipconfig -all` to show all, includes not running elif 'linux' == sys.platform: .
2021-06-15 16:43:45
365
原创 Python3 获取当前主机所有IPv4网络适配器
# !/usr/bin/python3# coding: utf-8import netifacesdef list_ipv4_adapter(): mapping = {} gateways = netifaces.gateways() if netifaces.AF_INET in gateways: ipv4gates = gateways[netifaces.AF_INET] for gate in ipv4gates: .
2021-06-15 16:41:20
830
原创 Python3 判断端口是否被占用
# !/usr/bin/python3# coding: utf-8import osimport sysdef access(port): if port < 1024 or 65535 < port: # privileged port # out of range return False if 'win32' == sys.platform: cmd = 'netstat -aon|finds.
2021-06-15 15:55:43
1939
转载 我们为什么要用IoC和AOP
作为一名 Java 开发,对 Spring 框架是再熟悉不过的了。Spring 支持的控制反转(Inversion of Control,缩写为IoC)和面向切面编程(Aspect-oriented programming,缩写为AOP)早已成为我们的开发习惯,仿佛 Java 开发天生就该如此。人总是会忽略习以为常的事物,所有人都熟练使用 IoC 和 AOP,却鲜有人说得清楚到底为什么要用 IoC 和 AOP。技术肯定是为了解决某个问题而诞生,要弄清楚为什么使用 IoC 和 AOP,就得先弄清楚不.
2021-02-23 18:20:27
219
OracleXE安装后用户登录出现ORA-01089错误
2015-04-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅