iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 17
0
DevOps

Puppeteer系列 第 17

Puppeteer & Rabbitmq

介紹

Puppeteer 因為也可以是爬蟲的角色,這時候就不得不提到任務管理的套件,可以想像如果有個產品頁面有過個class 跟很多產品內頁 ,情況 看起來能像是 網址/prodution/classId/productionId 透過 Puppeteer 把這類的基礎任務全部的都列成任務清單,如果想要多台機器並發 又有錯誤的回饋與重發 這時候 Rabbitmq就是你的好選擇之一,類似的套件也有很多 Rabbitmq 相比之下是個重量級的套件

官網的部分教學一共有六個單元 每個單元都可以觀看不同語言的DEMO

https://www.rabbitmq.com/getstarted.html

  1. Hello World

學習Rabbitmq 要先了解這張圖片https://ithelp.ithome.com.tw/upload/images/20180105/20103438nR022SPKfo.png

P (producer) 可以想成發送訊息的 中間的紅色的就是任務 是推疊 query 的方式 pop in pop out 後面的C (consumer) 就是準備要來執行這些query 而這些都是可以多個然後產生不同的結構

Hello World 看到的是最簡單的

server端安裝 請參考 https://www.rabbitmq.com/download.html 不同版本下的安裝方法

clent端安裝 以 node.js 為例

npm install amqplib
var amqp = require('amqplib/callback_api');

連結到 rabbitmq server

amqp.connect('amqp://localhost', function(err, conn) {});

Client Sending

新增 Channel 並發送一個query到這個ch 裡面

amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var q = 'hello';

    ch.assertQueue(q, {durable: false});
    // Note: on Node 6 Buffer.from(msg) should be used
    ch.sendToQueue(q, new Buffer('Hello World!'));
    console.log(" [x] Sent 'Hello World!'");
  });
});

如果結束後記得把連線關掉

setTimeout(function() { conn.close(); process.exit(0) }, 500);

Client Receiving

安裝

var amqp = require('amqplib/callback_api');

這邊跟上面的P一樣再次啟動一次,確保Channel有跑起來

amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var q = 'hello';

    ch.assertQueue(q, {durable: false});
  });
});

使用ch.consume 去接 query ,這樣就是一個最基本的 Rabbitmq Hello World

console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q);
ch.consume(q, function(msg) {
  console.log(" [x] Received %s", msg.content.toString());
}, {noAck: true});

總結

Rabbitmq 如果base很大 ,就可以考慮做多台 consume 去接收不同頻道的工作這樣的好處就是可以把每一台機的資源用到剛剛好 ,不會讓機器負擔太重或是都沒有工作

https://www.rabbitmq.com/


上一篇
Puppeteer & regex101
下一篇
Puppeteer & 工人智慧 驗證
系列文
Puppeteer30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
kula0826
iT邦新手 5 級 ‧ 2019-01-18 16:53:41

請問Puppeteer如果爬取資料失敗, Rabbitmq會幫忙重複執行到成功為止這樣嗎?

我要留言

立即登入留言