0%

Kafka 自定义组件详解:分区器、序列化器与拦截器

Kafka 提供了灵活的扩展机制,允许用户通过自定义组件(如分区器、序列化器、拦截器)满足特定业务需求。这些组件可深度集成到消息生产流程中,实现消息路由、格式转换、内容增强等个性化功能。本文将详细介绍如何开发和使用这些自定义组件,并解析其执行顺序与应用场景。

自定义分区器(Partitioner)

Kafka 默认分区策略基于消息键(Key)的哈希值分配分区,但在复杂业务场景(如按地区、用户类型路由消息)中,需自定义分区逻辑。

核心接口与方法

自定义分区器需实现 org.apache.kafka.clients.producer.Partitioner 接口,核心方法:

方法 作用
int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) 计算消息应发送到的分区编号,返回值为分区索引(从 0 开始)。
void configure(Map<String, ?> configs) 初始化配置(如从生产者配置中读取参数)。
void close() 资源清理(如关闭连接、释放内存)。

实现示例:按业务类型分区

假设需将包含 “order” 的消息发送到分区 0,包含 “log” 的消息发送到分区 1,其他消息按 Key 哈希分配:

阅读全文 »

mac上下载spark使用

1
brew install apache-spark
阅读全文 »

二进制数的表示与运算:原码、反码、补码与移码

二进制是计算机存储和运算的基础,带符号的二进制数通过特定编码方式(原码、反码、补码、移码)处理正负值,其中补码是计算机底层实际采用的存储形式。以下从编码规则、表示范围到存储原理展开详细说明:

二进制数的符号表示与基本概念

符号位

  • 二进制数用最高位表示正负:0代表正数,1代表负数。
  • 例如:4 位二进制中,0011表示+31011表示-3(最高位1为符号位)。

真值与机器数

  • 真值:带符号位的二进制数对应的实际数值(如+3-3)。
  • 机器数:计算机中实际存储的带符号二进制数(如00111011)。

字长

  • 指计算机一次可处理的二进制位数(如 32 位、64 位),决定了数值的表示范围。

四种编码方式的规则与示例

设字长为n位(含 1 位符号位),以n=4为例(符号位 1 位,数值位 3 位):

原码

  • 规则:

    • 正数:符号位为0,数值位为真值的绝对值(如+30011)。
    • 负数:符号位为1,数值位为真值的绝对值(如-31011)。
  • 特殊值:

    • +0原码为0000-0原码为1000(存在两个 0 的表示)。
  • 示例:

    | 真值 | 原码 |
    | —— | —— |
    | +3 | 0011 |
    | -3 | 1011 |
    | +0 | 0000 |
    | -0 | 1000 |

阅读全文 »

广告系统中的频控实现:从 Redis 到 HBase 的方案详解

在广告投放中,频控(频率控制) 是核心机制之一,用于限制同一用户对同一广告的曝光次数(如 “1 小时内最多看 3 次”),避免用户反感并优化广告资源利用率。本文将详细介绍如何基于 Redis 和 HBase 实现频控,并分析两种方案的适用场景。

频控的核心需求与设计原则

核心需求

  • 精准计数:准确记录用户对特定广告的曝光 / 点击时间,支持按周期(天 / 小时 / 分钟)统计。
  • 高效判断:快速判断当前请求是否超出频控限制(如 “用户 A 在 1 小时内已看广告 B 5 次,限制为 3 次则拒绝投放”)。
  • 高并发支持:广告系统峰值请求可达百万级 QPS,频控判断需在毫秒级完成。
  • 数据持久化:长期保留用户行为数据(如 90 天),用于数据分析和策略优化。

设计原则

  • key 设计:需唯一标识 “用户 - 广告” 组合,通常采用 uid:campaignId 作为键(uid 为用户唯一标识,campaignId 为广告计划 ID)。
  • 时间排序:存储的行为时间需按顺序排列,便于快速筛选指定周期内的记录。
  • 过期清理:自动删除超出统计周期的数据(如只保留 24 小时内的记录),减少存储压力。

基于 Redis 的频控实现(高并发场景首选)

Redis 凭借内存存储和丰富的数据结构,成为高频场景下频控的首选方案,尤其适合实时性要求高的场景(如信息流广告实时投放)。

数据结构选择

使用 Redis List 存储用户对广告的行为时间戳,原因如下:

阅读全文 »

Kafka 镜像操作详解:跨集群数据同步

Kafka 镜像操作(MirrorMaker)是实现跨集群数据同步的核心工具,通过消费源集群的消息并生产到目标集群,实现两个 Kafka 集群之间的数据镜像。这种机制适用于灾备、数据迁移、多区域部署等场景。本文将详细介绍 MirrorMaker 的工作原理、配置方法及操作步骤。

镜像操作核心原理

MirrorMaker 的工作机制本质是 “消费 - 生产” 模式:

  1. 消费者:从源集群的指定主题拉取消息。
  2. 生产者:将拉取的消息推送到目标集群的同名(或指定)主题。

通过这种方式,目标集群会实时同步源集群的消息,形成 “镜像”。MirrorMaker 支持通过正则表达式(--whitelist)过滤需要同步的主题,灵活控制同步范围。

镜像操作工具:kafka-mirror-maker.sh

Kafka 提供 kafka-mirror-maker.sh(Linux/Mac)或 kafka-mirror-maker.bat(Windows)脚本执行镜像操作,核心参数如下:

参数 作用
--consumer.config 源集群消费者配置文件路径(必传)。
--producer.config 目标集群生产者配置文件路径(必传)。
--whitelist 正则表达式,指定需要同步的源集群主题(如 `test-mirror topic.*`)。
--blacklist 正则表达式,指定无需同步的源集群主题(与 --whitelist 互斥)。
--num.streams 消费线程数(默认 1,增加可提升同步吞吐量)。

操作步骤

环境准备

  • 源集群(待同步数据的集群)和目标集群(接收同步数据的集群)已正常运行。
  • 确保源集群的主题在目标集群中已创建(可手动创建或配置自动创建)。

配置文件

(1)消费者配置文件(源集群)

创建 consumer-mirror.properties,配置源集群连接信息:

阅读全文 »