生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。
Message Queue (MQ),又稱為消息佇列,是一種訊息傳遞仲介。在這種架構中,生產者(Producer)生成並發送消息,仲介(Broker)管理和傳遞消息,消費者(Consumer)接收並處理消息。消息佇列提供了不同程序或不同系統之間的非同步溝通。
const buffer = <any>[] //用一個array當作是緩衝區
const MAX_BUFFER = 10 //緩衝區最大上限
//設一個生產者
class Producer {
private buffer: any[]
//告訴它buffer
constructor(buffer: any[]) {
this.buffer = buffer
}
//產生一個容易被發現的內容
random = () => String(~(Math.random() * 1000)).padStart(3, "0")
start = () => {
//使用 setInterval 定時器
setInterval(() => {
//每秒產生消息往緩衝區塞資料
if (this.buffer.length >= MAX_BUFFER)
return console.warn("緩衝區已滿,請稍等")
//產生message的內容
const msg = "內容" + this.random()
console.log("產生" + msg)
//將資料放進buffer
this.buffer.push(msg)
}, 1000)
}
}
//設一個消費者
class Consumer {
private buffer: any[]
constructor(buffer: any[]) {
this.buffer = buffer
}
start = () => {
setInterval(() => {
//消費者往緩衝區拿資料
if (this.buffer.length <= 0) return console.warn("緩衝區已空,請稍等")
//將資料取出來處理
const msg = this.buffer.shift()
console.log("取出", msg, "來處理")
}, 1200)
}
}
//緩衝區監控器來偵測buffer內的資料有哪些
const buffer_monitor = setInterval(() => {
console.log("--> 緩衝區目前有", buffer.length, "筆資料")
}, 500)
//建立生產者和消費者實例,並將共享的 buffer 傳遞給它們
const producer = new Producer(buffer)
const consumer = new Consumer(buffer)
// 啟動生產者和消費者
producer.start()
consumer.start()
/**--> 緩衝區目前有 0 筆資料
產生內容-684
--> 緩衝區目前有 1 筆資料
取出 內容-684 來處理
--> 緩衝區目前有 0 筆資料
產生內容-380
--> 緩衝區目前有 1 筆資料
取出 內容-380 來處理
-->不斷產出資料直到terminal結束/*