Bull

Queue Manager

Why queue?

High traffic capacity

System Design

Google Cloud

CDN

Google Cloud

CDN

Compute Engine (AP)

Cloud Storage (Static Files)

CDN

Compute Engine

(AP)

Cloud Storage

(Static Files)

Load Balancing

Compute Engine

(AP)

Compute Engine

(AP)

Cloud SQL

(Database)

CDN

Compute Engine

(AP)

Cloud Storage

(Static Files)

Load Balancing

Compute Engine

(AP)

Compute Engine

(AP)

Cloud SQL Cluster

(Read)

Cloud SQL Cluster

(Write)

Cloud SQL Cluster

(Read)

All stateless nodes are scalable

State Storage is only short part in system

Change session based token to JWT

AP nodes            stateless

Schema design

Reduce index in frequently insert table

Replace auto increment pk with uuid, snowflake ...

Pre-insert data, update only use row lock

Only ticket-like record select with FOR UPDATE

DON'T use count() / limit in frequently update table

Data slicing

Slice seats to difference table/database:

- Reduce table flush times into disk

- Reduce each database query analyze CPU usage

- Mark sold when select from AP, and commit it after checkout

Cache the seat available in ap level

- (Crazy) inter-AP communication to trade marked tickets

BUT

If zone A tickets sold out, all customers will change to find a chance to buy zone B tickets.

We cannot always predict the distribution of zone requirements.

Recognize system limit

Someone checkout successful better than everyone block out

Rate Limiter

Numbered queue

const Queue = require('bull');
const express = require('express');

const app = express();

const rateLimiter = new Queue('rateLimited', {
  limiter: {
    max: 5000,
    duration: 1000, // 1 sec
  },
});

rateLimiter.process(({ data }) => {
  return `OK! ${Date.now()}`;
});

function fetchResponse() {
  return new Promise(async (resolve) => {
    const job = await rateLimiter.add({ foo: 'bar' });
    const response = await job.finished();

    resolve(response);
  });
}

app.get('/', async (req, res) => {
  res.send(await fetchResponse());
});

app.listen(7887, () => {
  console.log('Server listen on 7887');
});

Live demo

Thanks

Bull - Rate Limiter

By Chia Yu Pai

Bull - Rate Limiter

  • 360