alpakka-kafka(4)-kafka应用案例-系统分析

2024-04-09 04:32

本文主要是介绍alpakka-kafka(4)-kafka应用案例-系统分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  上一篇我们通过示范案例基本了解了一个独立交易类型的库存管理模块应该是怎样的一块业务。这篇我们讨论一些如何从技术上来实现这样的业务模块。讲确切点应该说如何借助kafka的特性来实现功能开发。

底层方面:多节点服务器集群、kafka分布部署。

对上一层主要关注partition相关的问题:partition的分布与consumer如何对应。根据kafka官方文档:一个topic分出多个partition,一般按照集群节点broker倍数设置。那么一个topic的partition差不多以同等数量分布于每个broker上。或者针对一个topic,每个集群节点上都有多个partition。从consumer配置来讲就是在每个节点上部署同一组(相同consumer-group-id)consumer。所谓consumer就是alpakka-kafka的一个stream。由于最终的完整应用会部署在每一个集群节点,应用中包括了consumer,所以每组consumer已经是分布式的了,不需要分片sharding机制。在每个节点启动应用时就开始运行多个应用里的kafka-conusmer-stream就行了,至于consumer分布式运算是体现在底层kafka的分布式部署上的。

再上一层是库存交易运算层,这部分功能是业务实现核心,包括:库存状态更新、库存流转、交易日志、库存账目等等。我们目前只关心库存状态。但假设这部分完整业务功能是多并发、复杂又消耗资源的,那么应该把它作为分片sharded-entity来设计。这样,这些耗资源的运算可以被分发到各节点上去运算了。还有一个问题需要考虑的:alpakka-kafka提供了一个独特的分片部署策略kafkaSharding,能实现partition与某分片在同一节点对应,这样可以节省消息跨节点传递,把消息读取和业务处理放到同一节点上去完成。不过对我们的案例来说,跨节点消息传递与把庞大的运算均衡的分发到多个节点上去相比较就显得微不足道了。所以,我们否定了使用kafkaSharding的想法。

这个库存管理业务模块应该是独立全封闭的。那么与其它业务模块甚至第三方软件交流就需要按照事先约定的通讯协议进行了,最合适的标准应该是http协议了。在库存管理模块外表构建一层http api,提供与外界的信息互动。这个案例的库存管理会通过api为外界用户提供读、写服务。具体工作场景如下:用户通过任何节点上的http端点用http-request调用api传递指令(读、写库存)-> api把指令写入kafka -> consumer从kafka读出指令传给一个shard-entity -> shard-entity按照指令处理库存数据 -> 通过http-response返回处理结果。

还有一些流程细节需要厘清:业务api的http-request分两大类型:库存查询(读)和库存更新(写)。其中库存更新又分单向和双向(fire-and-forget and request-response)。库存查询不需要kafka,直接发到一个shard-entity上面去查就行了。只有库存处理指令,因为要保证执行顺序,需要先写入kafka,然后consumer按照写入时序读出来交由一个shard-entity去处理。麻烦的是需要返回结果的双向指令,处理完业务后该如何把结果返回正确的http-request,毕竟指令是通过kafka发过去的。如果通过kafka返回结果,前端还需要构建consumer来接收。另一个方案是通过actor方式返回,这需要返回时获取正确的actorRef。这个比较容易实现:建一个管理结果返回请求的actor,把所有未完成请求消息放到一个集合里。请求消息里除提供请求者actorRef之外还必须有个文本类型的messageID,一个代表唯一的字符串。具体流程如下:http接到双向指令后分别构建包含messageID的producerRecord写入kafka、向返回请求管理actor发一条包含replyTo, messageID消息 -> consumer从kafka读取包括业务指令及messageID的消息 -> 把包含messageID的消息传给业务分片shard-entity进行业务处理 -> shard-entity处理业务完毕后向返回请求管理actor发一条包括处理结果及messageID的消息 -> 返回请求管理actor按照messageID从存放请求消息的集合里找到相应的actorRef -> 向actorRef发还结果。整个流程看起来好像又长又复杂,实际用了kafka效率还是很高的。到这已经把全部技术实现各节点都过了一遍,下面我们就可以一块一块分步去实现了。

这篇关于alpakka-kafka(4)-kafka应用案例-系统分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/887185

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi