softwaremill / mqperf

https://softwaremill.com/mqperf/
Apache License 2.0
145 stars 37 forks source link
ansible benchmark docker message-queue performance-testing sbt scala

MqPerf

A benchmark of message queues with data replication and at-least-once delivery guarantees.

Source code for the mqperf article at SoftwareMill's blog: Evaluating persistent, replicated message queues

Setting up the environment

Tools

Tests have been run with the following prerequisites:

AWS Credentials

Message queues and test servers are automatically provisioned using Ansible on AWS. You will need to have the AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY present in the environment for things to work properly, as well as Ansible and Boto installed.

See Creating AWS access key for details.

Message generation notes

Please consider the above when configuring message size parameter in test configuration: "msg_size": 100. If message is too short, then majority of its content will be the TS information. For that reason, we suggest configuring message length at 50+ characters.

Configuring tests

Test configurations are located under ansible/tests. Each configuration has a number of parameters that may influence the test execution and its results.

Running tests

Note: all commands should be run in the ansible directory

Provision broker nodes with relevant script

ansible-playbook install_and_setup_YourQueueName.yml

Note: since AWS SQS is a serverless offering, you don't need to setup anything for it. For SQS, you can skip this step.

Note: you can select EC2 instance type for your tests by setting ec2_instance_type in the group_vars/all.yml file

Provision sender and receiver nodes

ansible-playbook provision_mqperf_nodes.yml

Note: you can adjust the number of these EC2 instances for your own tests.

WARNING: after each code change, you'll need to remove the fat-jars from the target/scala-2.12 directory and re-run provision_mqperf_nodes.yml.

Provision Prometheus and Grafana nodes

ansible-playbook install_and_setup_prometheus.yml

WARNING: this must be done each time after provisioning new sender / receiver nodes (previous step) so that Prometheus is properly configured to scrape the new servers for metrics

Monitoring tests

Metrics are gathered using Prometheus and visualized using Grafana.

Accessing monitoring dashboard:

Execute test

Cleaning up

There are few commands dedicated to cleaning up the cloud resources after the tests execution.

Utilities

Implementation-specific notes

Kafka

Before running the tests, create the Kafka topics by running ansible-playbook kafka_create_topic.yml

Redpanda [vectorized.io]

Redpanda requires xfs filesystem, to configure it update storage_fs_type: xfs in all.yml file. Before running the tests, create the Redpanda topics by running ansible-playbook redpanda_create_topic.yml. Default partition number in a topic creation script is 64, if you need to adjust it update --partitions 64 param in redpanda_create_topic.yml script.

Redis Streams

Before running the tests, create the required streams and consumer groups by running ansible-playbook redistreams_create_streams.yml. This script creates streams named stream0, stream1... stream100. If you need more streams please edit the loop counter.

If you'd like to rerun tests without cluster redeployment use ansible-playbook redistreams_trim_streams.yml to flush the streams. To manipulate streams count use streamCount property in test JSON. Notes. Cluster create command (last step) sometimes fails randomly. It's sometimes easier to run it directly from ec2.

Pulsar

The ack property is set on the Bookkeeper level via the CLI or REST or a startup parameter. Go to the docs for more details. Currently, this is not implemented, hence the mq.ack attribute is ignored.

RabbitMQ

ActiveMQ

ActiveMQ Artemis

EventStore

Oracle AQ support

Ansible notes

Zookeeper installation contains an ugly workaround for a bug in Cloudera's RPM repositories (http://community.cloudera.com/t5/Cloudera-Manager-Installation/cloudera-manager-installer-fails-on-centos-7-3-vanilla/td-p/55086/highlight/true). See ansible/roles/zookeeper/tasks/main.yml. This should be removed in the future when the bug is fixed by Cloudera.

FAQ

Local test

To run locally execute the Sender and Receiver classes with following:

-Dconfig.file=/tmp/test-config.json

RUN_ID=1;HOST_ID=1