基于事件驱动架构构建微服务第13部分:使用来自Apache KAFKA的事件并将投影流传输到ElasticSearch...

原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part13-read-model-projection-project-streams-into-elasticsearch/

在本教程中,我将展示如何从KAFKA读取流并将流投影到ElasticSearch中。

我必须使用来自KAFKA的消息,我从KAFKA读取的消息是事件流。所以我必须将这些流投影到结构化表示中。然后我会将投影索引到ElasticSearch中。

所以我会建立一个订阅KAFKA并监听事件的消费者。如果它接收到一个event,它将使用投影来创建该事件的结构演示。最后将其存储到一个nosql数据库ElasticSearch。

投影事件

实际上,读取数千个事件会花费太长时间,相反我们可以预先计算当前状态并将其存储到nosql数据库中。投影可以定义为从一系列事件中导出的当前状态

我定义了一个基本的泛型类Entity,因此每个投影都将从它派生。

8c2ad52c9f8dea79e9412aa1af15eeb6.png

我定义了一个抽象的泛型类Projection,它接受一个事件列表并将它们应用于具体类(在我们的例子中是 SpeechProjection)。

eeb4f9189bb809869194e7d892a0d43b.png

SpeechProjection是一个表示我想从事件(SpeechCreatedEvent、SpeechTitleChangedEvent、SpeechDescriptionChangedEvent、SpeechUrlChangedEvent和SpeechTypeChangedEvent)重建其状态的实体的类。

因此,对于与给定实体(语音)相关的每个事件,我必须将事件应用于实体。

2a6a6dac5f0f731de363256b9aca61d7.png

ElasticSearch介绍

Elasticsearch是一种分布式RESTful搜索和分析引擎,能够处理越来越多的用例。作为Elastic Stack的核心,它集中存储你的数据,以实现闪电般的快速搜索、微调相关性和可轻松扩展的强大分析。https://www.elastic.co/elasticsearch/

转到以下链接安装elasticsearch:https://www.elastic.co/downloads/elasticsearch

你可以通过使用PowerShell运行以下命令 curl http://localhost:9200/ 或 Invoke-RestMethod http://localhost:9200 来验证安装是否正常

bccace0f039ae2b19937296181e83f13.png

以下代码创建一个通用存储库以连接到弹性搜索,并执行CRUD操作。

76a52cf48aa8e11033c781dd008fa1f4.png

创建工作服务

ASP.NET Core Worker Service模板为编写长时间运行的服务应用程序提供了一个起点。

我们可以使用工作服务来构建不需要用户交互或执行定期和长时间运行的工作负载的应用程序。

https://docs.microsoft.com/fr-fr/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-5.0&tabs=visual-studio

我将使用Worker Service构建一个消费服务,该服务消费来自APACHE KAFKA的事件并将它们索引到ElasticSearch

ConsumerHostedService

09c40c1adc5b2c1354882f578d33b31a.png

ConsumerHostedService是承载ConsumerService的后台服务

ConsumerService

ConsumerService调用服务总线,该总线在产生新事件时从Kafka接收通知。

d7f0104b98a4bb60cebf67bf449b8057.png

服务总线

KafkaClient

KafkaClient实现了IServiceBusProvider的ReceiveAsync。它订阅了一个Kafka主题,因此当一个事件发布到该主题时,它会通知一个中介服务。

2f88ca6381d23a9e1c7e4124e71ab6c8.png

ElasticSearchNotifier实现了INotificationHandler。这个类的职责是反序列化输入事件并将其索引到elasticsearch。

979d0064e2674536f14c759913547b5d.png

测试

启动zookeeper

zookeeper-server-start.bat config\zookeeper.properties

4b0d259d387d8dacfe196642361266f8.png

启动Kafka

kafka-server-start.bat config\server.properties

6470fa3625f6384fe412de41551daef9.png

启动ElasticSearch

启动下列工程:

  • LogCorner.EduSync.SignalR.Server

  • LogCorner.EduSync.Speech.Producer

  • LogCorner.EduSync.Speech.Consumer 启动下列工程:

    e79de7f21aec24ca85307008eaef1e48.png

  • LogCorner.EduSync.Speech.Presentationa5e52e300273262dbca6794ab3226b5d.png

启动Postman并且post一个新command 

a94c3a91de147b9c296c5105ea218947.png

你应该在消费者控制台上看到以下输出,使用postman上发布的命令

13797be7e2bd496928fd7d02b0b7cbab.png

代码源可在此处获得:

https://github.com/logcorner/LogCorner.EduSync.Speech.Command https://github.com/logcorner/LogCorner.EduSync.Speech.ServiceBus/tree/Feature/Task/IndexMessagesToElasticSearch

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值