Tiven Wang
Wang Tiven October 25, 2016
425 favorite favorites
bookmark bookmark
share share

上一篇Node.js with MongoDB service on HCP Cloud Foundry我们介绍了在HCP Cloud Foundry服务上如何创建Node.js Application,并且使用了MongoDB数据库服务存储数据。本篇介绍HCP CF的另外一项服务 - RabbitMQ,此功能可以让你搭建高性能可扩展的应用程序。本篇带你一步步创建RabbitMQ消息队列服务和其与Node.js应用程序的集成。

Series

  1. Getting Started with HCP Cloud Foundry
  2. How to develop a Node.js application with MongoDB service on HCP Cloud Foundry
  3. How to develop a Node.js applicaiton with RabbitMQ service on HCP Cloud Foundry

Prerequisites

Message queue提供了一种异步通讯机制,这对于网络时代大量请求并发的情况及其重要。例如服务器B在响应服务器A的每个请求时会消耗CPU比较长的时间,而服务器A有可能短时间内爆发出大量的请求,那么显然服务器B在短时间内处理不了这么大量请求,进而在一定时间内服务器A得不到B的响应则会出现异常。在服务器A并不需要得到B实质性的response的情况下(例如只需要得到“receive successful!”这样的答复),我们可以使用Message queue作为中间件应用程序,暂时接收下A的请求,再一个个发往B。

像这种既不属于B方主要功能又不属于A方需要负责的功能,使用Cloud Foundry应用程序去实现最好不过了,既解耦了双方程序,又可以进行灵活扩展。

Advanced Message Queuing Protocol是一个面向消息中间件的开发标准应用层协议,它规范了消息队列模式的各种特性如queuing, routing (包含 point-to-point and publish-and-subscribe), reliability 和 security.

AMQP有很多的不同语言的实现产品,其中RabbitMQ是其比较常用的一种实现。

接下来我们接着上一篇的代码,把mongodb存储消息改成使用message queue处理消息。

Install AMQP client for nodejs

关于AMQP client的Node.js版本常见的有两个/postwait/node-amqp/squaremo/amqp.node,这里我们使用前者。

npm install --save amqp

Application Code

本文完整代码可以在这里下载Github

Setup AMQP Client

Require AMQP client

let amqp = require('amqp');

Create connection

var conn = amqp.createConnection({url: "amqp://localhost"});

conn.on('ready', function() {
  // ...
});

Create exchange

每个消息都是通过exchange对象发送到queue的,exchange可以设置不同的routingKey来binding不同queues,这是对messages的分类方式。

var exchange = conn.exchange('cf-da', {'type': 'fanout', durable: true}, function() {
  // ...
});

Create queue

Queue会对binding到exchange的routingKey上或者空routingKey。

var queue = conn.queue('line', {durable: true, exclusive: true},
    function() {
      // ...
      queue.bind(exchange.name, '');
    });
queue.on('queueBindOk', function() {
    httpServer(exchange, oApp);
});

Setup Subscriber

通过Queue对象可以订阅其消息,每当有新消息发来时callback会被调用。

queue.subscribe(function(msg) {
  messages.push(msg);
});

Setup Publisher

Post Event

通过Exchange对象发布消息到queue。

oApp.post('/api/message', function (req, res) {
    for(var i = 0; i < req.body.result.length; i++) {
        var event = req.body.result[i];
        // publish the event message
        exchange.publish('', event);
    }
    // response
    res.json({info: "ok!"});
});

Get Messages

oApp.get('/api/message', function (req, res) {
    res.json(messages);
});

Local Test

Install RabbitMQ

下载安装Downloading and Installing RabbitMQ

Testing

测试方法同上一篇类似。

Push to Cloud Foundry

Create RabbitMQ service

cf create-service rabbitmq v3.6-container rabbitmq-digacc-service

Add Service in Manifest

---
applications:
- name: digital-account
  buildpack: nodejs_buildpack
  command: node app.js
  memory: 128M
  disk_quota: 128M
  host: digital-account
  services:
  - rabbitmq-digacc-service

Push App

cf push

现在可以测试往服务上并发大量请求了。 大功告成!

总结

本文介绍了在HCP Cloud Foundry服务上创建和使用RabbitMQ service的基本步骤,更全面的功能有待我们在接下来的文章里进一步探索。

References

Similar Posts

Comments

Back to Top