Skip to content

Commit 99f2b37

Browse files
authored
[Perf tests/service-bus-track-1] Add batch receive perf tests for Service Bus Track 1 (Azure#19790)
**Packages impacted by this PR:** - `@azure-tests/perf-service-bus-track-1` **Issues associated with this PR:** - Azure#18982 **Describe the problem that is addressed by this PR:** Add a test for receiveBatch using the track 1 service bus SDK in line with what we already have for the track 2 SDK **Provide a list of related PRs** _(if any)_ - Azure#18811
1 parent 93ee7db commit 99f2b37

File tree

7 files changed

+112
-11
lines changed

7 files changed

+112
-11
lines changed

sdk/servicebus/perf-tests/service-bus-track-1/README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,16 @@ Create a service-bus namespace and populate the .env file with `SERVICEBUS_CONNE
1212

1313
## Running the tests
1414

15-
To test sending messages in batches
15+
To test sending messages in batches:
1616

1717
> `npm run perf-test:node -- BatchSendTest --warmup 2 --duration 7 --parallel 2`
1818
19-
> `npm run perf-test:node -- BatchSendTest --warmup 1 --duration 25 --iterations 2 --parallel 32 --messageBodySize 10240 --numberOfMessages 10`
19+
To test receiving messages in batches:
20+
21+
> `npm run perf-test:node -- BatchReceiveTest --warmup 1 --duration 25 --iterations 2 --parallel 32 --size-in-bytes 2000 --number-of-messages 50`
22+
23+
To test `receiveMessages` - receiving messages in batches
24+
25+
> `npm run perf-test:node -- BatchReceiveTest --duration 5 --size 2000`
2026
2127
_Note: For more default options, refer [Perf-Framework-Default-Options](https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/test-utils/perf/README.md#keyconcepts)._

sdk/servicebus/perf-tests/service-bus-track-1/test/index.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
// Licensed under the MIT license.
33

44
import { PerfProgram, selectPerfTest } from "@azure/test-utils-perf";
5+
import { BatchReceiveTest } from "./receiveBatch.spec";
56
import { BatchSendTest } from "./sendBatch.spec";
67

78
console.log("=== Starting the perf test ===");
89

9-
const perfProgram = new PerfProgram(selectPerfTest([BatchSendTest]));
10+
const perfProgram = new PerfProgram(selectPerfTest([BatchSendTest, BatchReceiveTest]));
1011

1112
perfProgram.run();
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT license.
3+
4+
import { ReceiveMode, Receiver, Sender } from "@azure/service-bus";
5+
import { PerfOptionDictionary } from "@azure/test-utils-perf";
6+
import { ServiceBusTest } from "./sbBase.spec";
7+
8+
interface ReceiverOptions {
9+
"max-message-count": number;
10+
"number-of-messages": number;
11+
"message-body-size-in-bytes": number;
12+
}
13+
14+
/**
15+
* An underestimate of the true maximum size of a batch send message in bytes.
16+
* This number is used to split up the send requests into small enough chunks
17+
* to be accepted.
18+
*/
19+
const MAX_SEND_BATCH_SIZE_BYTES = 200000;
20+
21+
export class BatchReceiveTest extends ServiceBusTest<ReceiverOptions> {
22+
receiver: Receiver;
23+
public options: PerfOptionDictionary<ReceiverOptions> = {
24+
"number-of-messages": {
25+
required: true,
26+
description: "Total number of messages to send",
27+
shortName: "send",
28+
defaultValue: 10000,
29+
},
30+
"message-body-size-in-bytes": {
31+
required: true,
32+
description: "Size of each message body in bytes",
33+
shortName: "size",
34+
defaultValue: 2000,
35+
},
36+
"max-message-count": {
37+
required: true,
38+
description: "Max number of messages to receive",
39+
shortName: "max-receive",
40+
defaultValue: 50,
41+
},
42+
};
43+
44+
constructor() {
45+
super();
46+
this.receiver = ServiceBusTest.sbClient
47+
.createQueueClient(BatchReceiveTest.queueName)
48+
.createReceiver(ReceiveMode.receiveAndDelete);
49+
}
50+
51+
/**
52+
* Sends the messages to be received later.
53+
*/
54+
public async globalSetup(): Promise<void> {
55+
await super.globalSetup();
56+
const sender = ServiceBusTest.sbClient
57+
.createQueueClient(BatchReceiveTest.queueName)
58+
.createSender();
59+
60+
const {
61+
"number-of-messages": { value: numberOfMessages },
62+
"message-body-size-in-bytes": { value: messageBodySize },
63+
} = this.parsedOptions;
64+
65+
await sendMessages(sender, numberOfMessages, messageBodySize);
66+
}
67+
68+
public async runBatch(): Promise<number> {
69+
const messages = await this.receiver.receiveMessages(
70+
this.parsedOptions["max-message-count"].value,
71+
0.5
72+
);
73+
74+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
75+
for (const _ in messages) {
76+
// This is to represent the bare minimum user scenario where one would
77+
// iterate over the messages and process them
78+
}
79+
return messages.length;
80+
}
81+
}
82+
83+
async function sendMessages(sender: Sender, numberOfMessages: number, messageBodySize: number) {
84+
let messagesSent = 0;
85+
86+
while (messagesSent < numberOfMessages) {
87+
let messagesThisBatch = Math.min(
88+
numberOfMessages - messagesSent,
89+
Math.floor(MAX_SEND_BATCH_SIZE_BYTES / messageBodySize)
90+
);
91+
await sender.sendBatch(Array(messagesThisBatch).fill({ body: Buffer.alloc(messageBodySize) }));
92+
messagesSent += messagesThisBatch;
93+
console.log(`${messagesSent} messages sent so far`);
94+
}
95+
}

sdk/servicebus/perf-tests/service-bus-track-1/test/sbBase.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT license.
33

4-
import { PerfTest, getEnvVar } from "@azure/test-utils-perf";
4+
import { getEnvVar, BatchPerfTest } from "@azure/test-utils-perf";
55
import { ServiceBusClient } from "@azure/service-bus";
66
import { ServiceBusAdministrationClient } from "@azure/service-bus-v7";
77

@@ -11,7 +11,7 @@ dotenv.config();
1111

1212
const connectionString = getEnvVar("SERVICEBUS_CONNECTION_STRING");
1313

14-
export abstract class ServiceBusTest<TOptions> extends PerfTest<TOptions> {
14+
export abstract class ServiceBusTest<TOptions> extends BatchPerfTest<TOptions> {
1515
static sbClient: ServiceBusClient = ServiceBusClient.createFromConnectionString(connectionString);
1616
static sbAdminClient = new ServiceBusAdministrationClient(connectionString);
1717
static queueName = `newqueue-${Math.ceil(Math.random() * 1000)}`;

sdk/servicebus/perf-tests/service-bus-track-1/test/sendBatch.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ export class BatchSendTest extends ServiceBusTest<SendTestOptions> {
3838
this.batch = new Array(this.parsedOptions.numberOfMessages.value!).fill(sbMessage);
3939
}
4040

41-
async run(): Promise<void> {
41+
async runBatch(): Promise<number> {
4242
await BatchSendTest.sender.sendBatch(this.batch);
43+
return this.batch.length;
4344
}
4445
}

sdk/servicebus/perf-tests/service-bus/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ To test sending messages in batches
1717
1818
To test `receiveMessages` - receiving messages in batches
1919

20-
> `npm run perf-test:node -- BatchReceiveTest --duration 5 --size 2000`
20+
> `npm run perf-test:node -- BatchReceiveTest --duration 5 --size 2000 --number-of-messages 10000 --size-in-bytes 2000 --max-message-count 50`
2121
2222
_Note: For more default options, refer [Perf-Framework-Default-Options](https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/test-utils/perf/README.md#keyconcepts)._

sdk/servicebus/perf-tests/service-bus/test/receiveBatch.spec.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ export class BatchReceiveTest extends ServiceBusTest<ReceiverOptions> {
1717
"number-of-messages": {
1818
required: true,
1919
description: "Total number of messages to send",
20-
shortName: "max",
21-
longName: "maximum",
20+
shortName: "send",
2221
defaultValue: 10000,
2322
},
2423
"message-body-size-in-bytes": {
@@ -31,8 +30,7 @@ export class BatchReceiveTest extends ServiceBusTest<ReceiverOptions> {
3130
"max-message-count": {
3231
required: true,
3332
description: "Max number of messages to receive",
34-
shortName: "max",
35-
longName: "maximum",
33+
shortName: "max-receive",
3634
defaultValue: 50,
3735
},
3836
};

0 commit comments

Comments
 (0)