用扩散法扩展Redis的Pub-Sub功能

307 阅读5分钟

通过一个使用Diffusion Cloud和Redis Pub-Sub服务器的简单应用,介绍Diffusion实时事件数据平台。

Redis是一个开源的内存数据结构存储,可作为数据库、缓存和消息代理使用。虽然在业界非常流行,但它也有一些基本的限制。

使用Diffusion Cloud,我们可以扩展Redis可以同时处理的客户端和连接数,消除Redis的pub-sub订阅限制。

这个JavaScript代码例子将帮助你从一个公共API实时发布数据到Redis,从中消费,并通过我们强大的Topic Views功能实时转换数据。你也可以使用我们SDK中的其他编程语言,包括iOS、Android、C、.NET等。

数据管道

Diffusion Cloud Credentials

我们首先设置我们的Diffusion Cloud凭证,你可以使用我们在本教程中提供的凭证,或者你可以在Diffusion Cloud中创建你自己的凭证。

1)数据源

在本教程中,我们将使用Coindesk API来检索比特币的当前价值,包括美元、欧元和英镑;尽管我们只打算为我们的图表提供美元。

https://api.coindesk.com/v1/bpi/currentprice.json

我们创建了一个名为DataFeeder.js的组件,它连接到Coinbase REST API,当它收到更新时,它会将数值发布到数据层的Redis服务中。

一旦Coinbase的数据进入Redis,我们就可以在应用程序中把它可视化。

2) 数据层。Redis Pub-Sub

我们有一个名为redis-server.js的NodeJS应用程序。这个应用程序作为数据馈送和Redis服务器之间的一个通道,并返回。

3) 应用层

后台应用

这个应用从Redis Topic中获取数据,然后使用Diffusion SDK将相同的内容发布到Diffusion云服务中。在这里,所有的业务逻辑都可以通过编程来实现。如果我们没有Diffusion的功能,通常会这样做,使事情变得更容易。

Diffusion云服务

这是神奇的地方,通过主题视图,接收到的数据可以被丰富和细化,允许客户只消费相关的数据,提高数据效率。

一旦数据流入Diffusion Cloud,任何客户端应用程序都可以非常容易地订阅它。

4) 客户端层。

在客户端层,我们有RedisDiffusion客户端。

这些客户端订阅了Redis和Diffusion主题,并在他们的图表中显示收到的数值。

检查Diffusion客户端中的接收数据。你会注意到,由于Diffusion Cloud的数据处理能力,数据消耗量比Redis客户端少得多。

行动中的代码

为了展示每个层的隔离性,我们特意重复了代码;只是为了本教程的目的。

它是如何工作的

Redis和Web服务器

我们使用docker来设置和运行一个Redis服务器和一个Web服务器来托管Web应用程序。

(1) 数据输入

我们从外部API轮询我们的数据,在这种情况下,Coindesk。并将其发布到Redis。

/**

(2) Redis NodeJS服务器(数据层

为了与Redis服务器连接,我们建立了一个NodeJS服务器。这个应用程序在Redis服务器旁边的服务器侧运行。

  1. NodeJS服务器将连接到Redis服务器,并创建和使用一个Topic,以通过数据流。为了执行这种互动,redisPublisher和redisConsumer客户端都被实例化了。
  2. 为了与Web应用程序(客户端)通信,它将打开一个连接到WebSocket。我们使用端口3000。
  3. 从 WebSocket 消耗的每个数据都由 redisPublisher 发布到 Redis 服务器的 Topic 上。
  4. 用redisConsumer对象从Redis服务器消费的每个数据反过来都被发布到WebSocket。

这是代表该互动的一段代码。

server.on('connection', 
    // Message received from Redis, and sent through Websocket to Webclients

(3) 后端应用程序(应用层

我们从Redis消费并发布到Diffusion。

/**
    /**

我们在这里没有任何Diffusion云代码。这只是因为我们在这里有我们所需要的一切,可以在数据上实现我们的业务逻辑,而不需要写代码。

(4) Diffusion客户端(客户端层)

我们在这里只描述Diffusion客户端,因为Redis客户端的工作原理非常相似,但是从Redis中消费。

所以,Diffusion客户端只消费它需要的来自diffusion Topic的数据,并将其显示在图表中。

/**
/**
    
    // This message came from Diffusion! Feed Diffusion's Chart

核心类

这些是用于与不同层的Diffusion Cloud交互的类。

扩散服务

该服务被应用层和客户端使用,通过其Javascript SDK客户端,作为与Diffusion Cloud的隔离层。

这就是连接功能。

/**
        // Instantiate Diffusion's Client
        // Set Diffusion config
        // And connect to it
    /**

这是服务如何使用SDK来发布消息。

/**

Diffusion SDK客户端

最后,我们有一段代码,负责直接与Diffusion Javascript SDK进行交互。这是Diffusion服务在应用层和客户端都使用的类。

这就是它如何使用SDK函数连接到Diffusion的。

/**
/**
        /* If we setup a connected callback, let's call it */

这是它如何订阅主题,并处理该主题中收到的消息。

/**
    /* And subscribe to the topic */
onReceiveMessage = (topic, specification, newValue, oldValue) => {

最后,这是它向主题发布消息的方式。

// Interface Functions

前提条件

  • 下载我们的代码示例或将其克隆到你的本地环境。
git clone 
  • 一个Diffusion服务(云端或内部),版本6.6或更高。在这里创建一个服务。
  • 按照我们的快速入门指南,在一分钟内完成服务的创建

运行它

  1. 要求。
  2. docker和docker-compose
  3. nodejs和nodemon
  4. 从项目的根目录下运行:docker-compose up -d -> 来启动Web服务器和Redis服务器。
  5. 从项目的根目录运行。
  6. nodemon js/data-tier/redis-server.js -> 来启动redis服务。
  7. 在你的浏览器中,转到:localhost:8008。
  8. 这就对了!
  9. 首先在顶部设置Diffusion凭证。
  10. 然后开始从外部API进行轮询。
  11. 你会看到两个图表都在更新。检查图表所接收的数据大小,并认识到使用Diffusion可以节省多少数据

原文来源:https://bit.ly/37B3wu5


用Diffusion扩展Redis Pub-Sub最初发表在Nerd For Tech的Medium上,人们通过强调和回应这个故事来继续对话。