-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathbenchmark.ts
96 lines (79 loc) · 2.69 KB
/
benchmark.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// node -r ts-node/register/transpile-only benchmark.ts
/* eslint no-console: off */
import {randomBytes} from 'node:crypto'
// @ts-ignore
import amqplib from 'amqplib' // npm install --no-save amqplib
import {Bench} from 'tinybench'
import {Connection} from './lib'
declare global {
namespace NodeJS {
export interface ProcessEnv {
MODULE?: 'rabbitmq-client' | 'amqplib'
RABBITMQ_URL?: string | undefined
/** Disable Nagle's algorithm (send tcp packets immediately) */
NO_DELAY?: 'true'|'false'
}
}
}
const RABBITMQ_URL = process.env.RABBITMQ_URL || ''
if (!RABBITMQ_URL)
throw new TypeError('RABBITMQ_URL is unset')
const NO_DELAY = process.env.RABBITMQ_NO_DELAY === 'true'
const TRANSIENT_QUEUE = process.env.TRANSIENT_QUEUE || 'perf_' + randomBytes(8).toString('hex')
const NULL_ROUTE = process.env.TRANSIENT_QUEUE || 'perf_' + randomBytes(8).toString('hex')
const PAYLOAD = Buffer.from('prometheus')
console.log(`
NO_DELAY=${NO_DELAY}
TRANSIENT_QUEUE=${TRANSIENT_QUEUE}
NULL_ROUTE=${NULL_ROUTE}
`)
async function addRMQC(bench: Bench, rabbit: Connection, routingKey: string) {
const pub = await rabbit.acquire()
await pub.confirmSelect()
bench.add(`rabbitmq-client publish-confirm (${routingKey})`, () => {
return pub.basicPublish(routingKey, PAYLOAD)
}, {
afterAll() {
pub.close()
}
})
}
async function benchAMQPLIB(bench: Bench, conn: any, routingKey: string) {
const ch = await conn.createConfirmChannel()
bench.add(`amqplib publish-confirm (${routingKey})`, async () => {
ch.publish('', routingKey, PAYLOAD, {})
return ch.waitForConfirms()
}, {
afterAll() {
ch.close()
}
})
}
async function main() {
const bench = new Bench()
const rabbit = new Connection({
url: RABBITMQ_URL,
noDelay: NO_DELAY
})
rabbit.on('error', err => { console.error('connection error', err) })
rabbit.on('connection.blocked', () => { console.error('connection.blocked') })
rabbit.on('connection.unblocked', () => { console.error('connection.unblocked') })
const conn = await amqplib.connect(RABBITMQ_URL, {
noDelay: NO_DELAY
})
// @ts-ignore
conn.on('error', err => { console.error('connection error', err) })
conn.on('blocked', () => { console.log('connection.blocked') })
conn.on('unblocked', () => { console.log('connection.blocked') })
await addRMQC(bench, rabbit, NULL_ROUTE)
await benchAMQPLIB(bench, conn, NULL_ROUTE)
await rabbit.queueDeclare(TRANSIENT_QUEUE)
await addRMQC(bench, rabbit, TRANSIENT_QUEUE)
await benchAMQPLIB(bench, conn, TRANSIENT_QUEUE)
await rabbit.queueDelete(TRANSIENT_QUEUE)
await bench.run()
await rabbit.close()
await conn.close()
console.table(bench.table())
}
main()