热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

kafka削峰_kafka消息队列里的broker和offset都是啥?

都2020年,应该没有项目不用消息队列的吧?消息队列解决了哪些问题,条件反射应该都能回答“异步消息”、“应用解耦”和“流量削峰”和。消息队
07862c423d56f577613abb3a9d79e0e6.png

都 2020 年,应该没有项目不用消息队列的吧?消息队列解决了哪些问题,条件反射应该都能回答“异步消息”、“应用解耦”和“流量削峰”和。

消息队列使用场景

1、异步处理

比如 @Python大星 之前做的基金项目,当用户购买成功后,有如下几个操作:

① 保存订单信息;② 短信通知用户;③ 当购买金额大的时候邮件通知销售人员;④ 用户积分增加,可兑换奖品或者优惠券。

同步处理这些请求,用户体验差。当我们对接口的 Rt(ResponseTime 响应时间)有要求时,需要异步处理比如短信、邮件和积分问题。

2、应用解耦

比如线下活动购物 POS 机消费,如果消费满足一定条件,就进行微信推送引导用户参与抽奖。当多部门协助时,其他部门负责 POS 机消费信息推送,本部门负责接收信息处理相应的业务逻辑。

3、流量削锋

一般在秒杀或团抢活动中使用广泛。用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。秒杀业务根据消息队列中的请求信息,再做后续处理。

MQ 选型

面试中,考官经常会问你技术选型的问题,比如消息中间件,市场上种类繁多,如何选择一个合适的呢?

咨询了很多开发小伙伴,有的用 kafka、有的用 rocketMQ、还有的用 rabbitMQ。没有好坏之分,只有适不适合。

8519e4925a15ea046eafcd408439960d.png

图 1

根据图 1 中,我们可以综合几个方面来选型:

① 社区活跃性。

万一哪天这个 mq 社区没人维护,出现 bug, 怎么办,重新再选一个 MQ 吗?从图中可以看出 ActiveMQ 活跃度很低。

② 单机吞吐量。

目前 ActiveMQ、RabbitMQ 吞吐量在万级,而 RocketMQ 和 kafka 在 10 万级;

③ 时效性

ActiveMQ、RocketMQ 和 kafka 延迟在 ms 级别,RabbitMQ 延迟在 ms 级别;

④ 可用性

ActiveMQ、RabbitMQ 基于主从复制,高可用; RocketMQ 和 kafka 非常高,分布式架构;

⑤ 消息可靠性

RocketMQ 有较低概率丢失数据,RabbitMQ 基本不丢,RocketMQ 和 kafka 可以做到 0 丢失;

⑥ 功能扩展

kafka 功能较简单,日志采集 nb,其他是三个不分上下。

kafka

把消息放到【队列】里,我们叫【消息生产者】 producer,把 消息从队列里取出来,我们叫【消息消费者 】consumer。

1、consumer 如何区分 producer 里的消息???

通常,我们在使用消息队列时,n to n,多个 producer 和 consumer,如何进行区分,这里使用了 topic 的概念,给 队列取个响亮的名字。

2、kafka 如何保证吞吐量???

从上面图 1 中我们看出,kafka 在 topic 从几十到几百个时,吞吐量会大幅度下降,尽量保证 topic 数量不要过多。

比如说:n 个 producer 往 topic 里塞消息, n 个 consumer 从 topic 里取消息。

为了提高吞吐量,kafka 使用 partion 分区的概念(和 Mysql 分区类似)

3、kafka 如何保证高可用

当然是集群了,用它,用它,用它。

在 kafka 集群中,我们把每个 kafka 服务器叫“broker”。

比如说我们这 3 台 broker,每台里有 3 个 partion,当 producer 生产消息时,分别进入 3 台 broker 的一个分区中(作为主分区),每台 broker 里剩余的 2 个 partion 只做备份 其他 2 个 broker 里的消息(备份分区)。 你品,你品,你细品。当某个 broker 挂了,选举其他 broker 里的 partion 来做主分区,实现高可用。

4、消费者如何保证消费消息

假设多个消费者 consumer 组团去消费分区里的消息,一个 consumer 对应 一个 分区,假设有一个 consumer 挂了,必然另一个 consumer 要去接盘,但是我得知道挂掉的 consumer 消费进度。

kafka 在这里使用了 offset 的概念,在以前版本的 Kafka,这个 offset 是由 Zookeeper 来管理的,后来 Kafka 开发者认为 Zookeeper 不合适大量的删改操作,于是把 offset 在 broker 以内部 topic (__consumer_offsets) 的方式来保存起来。

消息队列引发的问题

1、如何保证消息的幂等性???

① 数据库层面使用唯一性索引;

② 每次先查再保存到数据库;

2、如何保证消息的可靠性传输???

集群

3、如何保证消息的顺序性???

生产者在写的时候,其实可以指定一个 key,比如说我们指定了某个订单 id 作为 key,那么这个订单相关的数据,一定会被分发到同一个 partition 中去,而且这个 partition 中的数据一定是有顺序的。

写 N 个内存 queue,具有相同 key 的数据都到同一个内存 queue;然后对于 N 个线程,每个线程分别消费一个内存 queue 即可,这样就能保证顺序性。

ca4a04fea3b1827571cb3e482dc0762f.png

@Python大星 | 文



推荐阅读
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • Sapphire 测试网上线:首个支持 EVM 的隐私 ParaTime 环境
    Sapphire 测试网上线:首个支持 EVM 的隐私 ParaTime 环境 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • Java服务问题快速定位与解决策略全面指南 ... [详细]
  • openGauss行存储核心架构及其页面组织详解
    行存储的核心架构和页面组织是实现DML操作、可见性判断及多种管理功能的基础。作为基于磁盘的存储引擎,行存储在设计上采用了段页式结构,以优化数据的存储和访问效率。这种设计不仅确保了数据的高效存储,还为行存储的各种高级功能提供了坚实的技术支持。 ... [详细]
  • 智能制造数据综合分析与应用解决方案
    在智能制造领域,生产数据通过先进的采集设备收集,并利用时序数据库或关系型数据库进行高效存储。这些数据经过处理后,通过可视化数据大屏呈现,为生产车间、生产控制中心以及管理层提供实时、精准的信息支持,助力不同应用场景下的决策优化和效率提升。 ... [详细]
  • Python作为当今IT领域中最受欢迎且高效的语言之一,其框架能够显著加速Web应用程序的开发过程。本文推荐并对比了十大顶级Python Web开发框架,其中CubicWeb以其卓越的代码重用性和模块化设计脱颖而出,为开发者提供了强大的支持。 ... [详细]
  • 在主从复制架构中,Bingo_MySQL 同步工具的应用与优化具有重要意义。为确保高效同步,建议使用相同或兼容的 MySQL 版本,并确保两台服务器位于同一局域网内,且网络连接畅通无阻。若无法 ping 通,请检查 IP 配置及防火墙设置,以保证网络连通性。此外,合理的配置参数和定期维护也是提升同步性能的关键因素。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • Django框架下的对象关系映射(ORM)详解
    在Django框架中,对象关系映射(ORM)技术是解决面向对象编程与关系型数据库之间不兼容问题的关键工具。通过将数据库表结构映射到Python类,ORM使得开发者能够以面向对象的方式操作数据库,从而简化了数据访问和管理的复杂性。这种技术不仅提高了代码的可读性和可维护性,还增强了应用程序的灵活性和扩展性。 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
  • 在Linux系统中,原本已安装了多个版本的Python 2,并且还安装了Anaconda,其中包含了Python 3。本文详细介绍了如何通过配置环境变量,使系统默认使用指定版本的Python,以便在不同版本之间轻松切换。此外,文章还提供了具体的实践步骤和注意事项,帮助用户高效地管理和使用不同版本的Python环境。 ... [详细]
author-avatar
a734839433
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有