Redis作为数据库 - 使用PubSub和GraphQL订阅的实时数据更新
#react #graphql #redis #pubsub

我的宠物项目,我命名为可视化器,我用来了解更多有关Redis的信息,可以开始从Twitter的volume stream或他们的filtered stream开始摄入推文。

当它这样做时,可视化器可以生成当前摄入的推文中当前遇到的所有主题标签的实时流,并且对它们也排名。

在这篇文章中,我想浏览系统的那些部分处理新推文,提取和发布排名的主题标签,最后将它们推到前端以创建那个不错的单词云。

如果您只想查看代码,则在这里是github link for the backend,这里是link to the frontend。顺便提一句。这是我关于使用Redis的第三篇文章,因此请确保也阅读其他文章。

可视化器部分体系结构

可视化器由三个组件组成。

Visualizer — Partial Architecture

可视化器摄入 asp.net核心6服务,该服务处理推文并将其存储在redis中,以索引文档(以JSON格式)。它还发布了每个遇到的主题标签及其等级,即可视化器

可视化器api 另一种ASP.NET Core 6服务,可访问存储的Tweet数据以及排名的主题标签的实时流。 GraphQL是我喜欢的另一种技术,它的subscriptions非常适合将排名的主题标签推向任何消费者。

可视化器frontend fotextignts + ViteJs spa显示可视化器的特征。

在以后的文章中,我将更多地谈论我的架构原因,所以请关注我,不要错过它。

出版排名的主题标签

正如我提到的,可视化器摄入从Twitter的API V2获取推文,除了坚持下去,它还发布了遇到的任何遇到的标签及其等级。

推文数据检索不太有趣。可以说我正在使用Tweetinvi为此。

对于每个提取的标签,都会发生一些事情:

  • 存储和等级:我将每个主题标签存储在Redis Sorted Set中。这种重新数据结构具有集合的预期时间和空间特征,并增加了每次多次添加元素的排名。这对于我的用例来说是很棒的,因为除了抽出我的分类套件中的所有主题标签外,我不必做很多事情。

在这里,代码要获得 idatabase的实例。最好将其添加到您的DI容器中。


之后,我将主题标签添加到一个分类的集合中,我告诉Redis将该标签的排名增加1。请注意,我将新的排名作为响应。
  • 发布标签:在我获得了标签的新等级后,我将发布它。在这里,我使用的是Redis’ Pub/Sub,它使我可以将字符串消息发布到频道。这有效地将可视化器摄入**从**可视化器api

首先,您需要一个 isubscriber 实例。像大多数可重复使用的对象一样,我将其添加到我的DI容器中。


使用该订户,我可以将我的排名标签发布到频道

请注意,我使用A 排名 dto来表示主题标签及其等级,并且在发布之前,我将其序列化为JSON字符串。另请注意,我使用频道名称的常数。这是因为常数生活在同一解决方案中的共享项目中,并且由可视化器API 重复使用。

排名的主题标签

排名的主题标签流由可视化器API 消耗。它通过订阅可视化器摄入用来发布每个主题标签的同一渠道来做到这一点。

在Singleton服务中,我在该流中注册一个新主题标签的处理程序


在处理程序中,每个频道消息都应列为 calledhashtag *的实例,并传递到任何GraphQl subscriber

您看到的 *_rankedhashtagstream
,有一个平原的反应扩展名重录,带有1
的缓冲区

它立即向其订户广播任何通知。但是,我听到您问的是谁?它是订阅排名主题标签的GraphQL API用户;他们是订户。

可视化器中完成的方式非常针对我的需求和我使用的库,称为GraphQl-Dotnet


请注意,GraphQl 排名 sisscription采用一个称为 sample Intervalsecec 的参数,默认值为0。该值用于确定订户是否应尽快接收所有排名的主题标签当它们来的时候(通常称为实时,但在严格意义上不称为实时),或者如果订户应收到另一个排名的主题标签,则可以通过对每个进行实时流来获得。 sampleintervalsecec 秒。

可视化器前端

这可能是系统中最不有趣的部分,因为它仅处理数据检索和渲染。它使用Apollo Client for React连接到**可视化器API **和react-wordcloud以渲染数据。

在高级别上,前端检索了前50个主题标签,并以其等级为单位(未显示在本文中,但这是一个简单的排序设置操作)。这是为了在WordCloud中显示一些东西。

然后,它订阅了排名的主题标签流,并且每当排名的主题标签到达时,它要么覆盖现有的50个主题标签之一,要么添加到同一集合中。

订阅排名的主题标签

我使用Apollo客户端的CodeGen功能来创建一个不错的React Hook来订阅排名的主题标签


然后,每当有新排名的主题标签可用时,我的组件都会重新渲染。我将新排名的标签与最初的50个标签合并

排名的主题标签WordCloud

结论

显示一个漂亮的小词云涉及一些系统组件和多个概念,但每个概念都很容易理解。

让我知道您是否喜欢这些帖子,比平时更多的代码。给我一个帖子,让我知道并跟随我,不要错过Redis的任何以后的帖子。