redis queue_在Redis上通过Easy Message Queue扩展微服务

本文介绍了如何利用Redis和RSMQ在Heroku上快速构建一个事件驱动的微服务消息队列。通过消息队列,实现了组件之间的解耦,提高了应用程序的可扩展性和性能。示例应用展示了用户通过Web客户端提交通用申请,Web服务器接收请求并将消息添加到队列,工作进程从队列中提取并处理消息。这种方式简化了编码和部署,同时也优化了用户体验。
摘要由CSDN通过智能技术生成

redis queue

如果您是考虑通信协议的微服务开发人员,那么选择事件驱动的体系结构可能只会帮助您在晚上放松一些。 通过正确的设计,事件驱动的体系结构可以帮助您创建分离和异步的应用程序,从而为您的应用程序提供高性能和易于扩展的主要优点。

但是,一旦选择了事件驱动的,您仍然需要做出几个关键的设计决策。 ( 有关事件驱动的体系结构和选项,请参阅本文。 )最重要的决定之一是使用消息队列还是流。

在邮件队列中,发件人将针对收件人的邮件放入队列中。 邮件将一直保留在队列中,直到收件人检索到该邮件为止,此时邮件将被删除。

同样,在流中,发件人将消息放入流中,而收件人则侦听消息。 但是,流中的消息并不针对特定的收件人,而是可供任何和所有感兴趣的收件人使用。 收件人甚至可以同时使用多个消息,并且可以通过流历史记录播放一系列消息。

在本文中,我们将重点放在消息队列上。 我们将使用HerokuReddisRSMQ创建并部署一个简单,快速站起来的消息队列。 我们将研究我们的系统如何工作,它可以做什么以及一些优势。

为什么消息队列有帮助

消息队列可以被认为是原始的事件驱动架构。 他们推动了早期事件驱动设计的采用,并一直沿用至今。 在这些消息队列设计中,客户端(或其他组件)通常会在发生某些操作时创建一条消息,然后将该消息发送到针对特定收件人的队列。

一直闲着等待工作的接收者从队列中接收(或检索)消息,对其进行处理并执行某些工作单元。 收件人完成工作后,将从队列中删除该邮件。

这条传统路径正是我们下面的示例所要做的。 这是一个简单的设置,但是通过在事件的生产者和使用者之间放置一个队列,我们​​引入了一个去耦级别,该级别使我们能够独立构建,部署,更新,测试和扩展这两个组件。

这种解耦不仅使编码和开发操作变得更容易(因为我们的组件可以彼此保持无知),而且还使我们的应用程序更容易伸缩。 我们还减少了Web dynos上的工作量,这使我们能够更快地响应客户端,并允许我们的Web dynos每秒处理更多请求。 这不仅对业务有好处,而且对用户体验也有好处。

我们的示例应用

让我们创建一个简单的示例应用程序来演示消息队列的工作方式。 我们将创建一个系统,用户可以在该系统上通过网站提交通用申请。 这是一个简单的项目,您可以使用它作为实际用例,也可以作为更复杂项目的起点。 我们将使用Heroku,Redis,Node.js和RSMQ设置和部署我们简单而强大的消息队列。 这是一个很好的堆栈,可以使我们快速进入事件驱动的体系结构。

Heroku,Redis和RSMQ-事件驱动的绝佳组合

Heroku具有一键式部署和“幕后”扩展功能,而Redis则是内存中的数据存储和消息代理,它们是快速部署系统的绝佳组合,这些系统使我们能够专注于业务逻辑而非基础架构。 我们可以在Heroku上快速轻松地预配置Redis部署(dyno),该部署将根据需要进行扩展,并隐藏我们不想担心的实现细节。

RSMQ是一个基于Redis的开源简单消息队列,易于部署。 RSMQ具有几个不错的功能:它轻巧(仅500行javascript),速度快(每秒10,000+条消息),并且保证仅将消息传递给一个收件人。

我们还将遵循Heroku建议的“ Worker Dynos,Background Jobs和Queuing ”模式,它将为我们提供所需的解耦和可伸缩性。 使用此模式,我们将部署一个Web客户端(下图中的浏览器),该客户端处理用户输入并将请求发送到后端,运行队列的服务器(Web进程),以及一组工作程序(后台服务) )从队列中提取消息并完成实际工作。 我们将客户端/服务器部署为Web dyno,将worker部署为worker dyno。

让我们开始吧

一旦创建了Heroku帐户并安装了Heroku CLI,就可以使用CLI轻松地创建和部署项目。 运行此示例所需的所有源代码都可以在GitHub上找到

$ gitclone https://github.com/devspotlight/example-message-queue.git
$ cd example-message-queue
$ heroku create
$ heroku addons:create heroku-redis
$ git push heroku master$ heroku ps:scale worker=1
$ heroku open

如果您需要有关此步骤的帮助,这里有一些不错的资源:

系统总览

我们的系统由三部分组成:客户端Web应用程序,服务器和工作程序。 因为我们是如此紧密地分离,所以服务器和工作进程都可以根据需要轻松扩展和缩小。

客户端

我们的客户端Web应用程序已部署为我们的Web dyno的一部分。 UI并不是本文的重点,因此我们只构建了一个带有链接的简单页面。 单击链接将通用消息发布到服务器。

Web服务器

Web服务器是提供Web客户端的简单Express服务器。 它还在启动时创建队列(如果队列尚不存在),从客户端接收新消息,并将新消息添加到队列中。

以下是配置队列变量的关键代码段:

let rsmq = new RedisSMQ({
        host : REDIS_HOST,
        port : REDIS_PORT,
        ns : NAMESPACE,
        password : REDIS_PASSWORD
    });

并在第一台服务器首次运行时设置队列:

rsmq.createQueue({qname : QUEUENAME}, (err) => {
   if (err) {
        if (err.name !== "queueExists" ) {
            console .error(err);
            return ;
        } else {
            console .log( "The queue exists. That's OK." );
        }
   }
   console .log( "queue created" );
});

当客户端发布消息时,服务器将其添加到消息队列中,如下所示:

app.post('/job' , async (req, res) => {
   console .log( "sending message" );
   rsmq.sendMessage({
        qname : QUEUENAME,
        message : `Hello World at ${ new Date ().toISOString()} ` ,
        delay : 0
   }, (err) => {
        if (err) {
            console .error(err);
            return ;
        }
   });
   console .log( "pushed new message into queue" );
}); 

工人

适合作为工作人员dyno部署的工作人员,从队列中轮询新消息,然后从队列中提取那些新消息并进行处理。

我们在这里选择了最简单的选项:代码读取消息,对其进行处理,然后从队列中手动将其删除。 请注意,RSMQ中提供了更强大的选项,例如“ pop”(可同时从队列中读取和删除),以及“实时”模式的发布/订阅功能。

rsmq.receiveMessage({qname : QUEUENAME }, (err, resp) => {
   if (err) {
      console .error(err);
      return ;
   }
   if (resp.id) {
      console .log( "Hey I got the message you sent me!" );
      // do lots of processing here
      // when we are done we can delete the message from the queue
      rsmq.deleteMessage({ qname : QUEUENAME, id : resp.id }, (err) => {
         if (err) {
            console .error(err);
            return ;
         }
         console .log( "deleted message with id" , resp.id);
      });
   } else {
      console .log( "no message in queue" );
   }
});

如果需要,我们可以使用Throng轻松解雇多名工人。 是使用此库的与我们类似的设置的一个很好的例子

注意:部署辅助dyno时,请确保将Heroku仪表板“资源”选项卡下的辅助进程缩放到至少一个dyno,以便您的辅助符可以运行(如果您尚未在CLI中运行)。

运行示例

当我们部署并启动dynos时,我们会看到服务器启动,正在部署队列以及工作人员正在检查新消息。

当我们单击客户端上的链接时,您可以看到服务器将消息推送到队列中,然后工作人员抓取消息,对其进行处理并删除。

我们通过示例构建了一个快速站立但功能强大的消息队列。 我们已经构建了一个系统,该系统将各个组件分开,以使它们彼此之间不了解,并且易于独立构建,测试,部署和扩展。 这是建立可靠的,事件驱动的体系结构的良好起点。

如果还没有,请阅读我们关于微服务的系列文章中的其他文章,包括事件驱动架构的最佳实践以及流处理如何使事件驱动架构更好

翻译自: https://hackernoon.com/scale-your-microservices-with-an-easy-message-queue-on-redis-e92n2gk3

redis queue

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值