• Stars
    star
    143
  • Rank 247,717 (Top 6 %)
  • Language
    Scala
  • License
    Apache License 2.0
  • Created almost 10 years ago
  • Updated 6 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

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:

  • python 3.9.5 (via pyenv)
  • ansible 2.9.5 (pip install 'ansible==2.9.5')
  • boto3 1.17.96 (pip install boto3)

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

  • By default, each message has length of 100 characters (this is configurable)
  • For each test, we generate a pool of 10000 random messages
  • Each batch of messages is constructed using messages from that pool
  • Each message in the batch is modified: 13 characters from the end are replaced with stringified timestamp (TS value is used for measurement on the receiver end)

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:

  • Lookup the public IP address of the EC2 node where metric tools have been deployed.
  • Open IP:3000/dashboards in your browser
  • Login with admin/pass credentials
  • Select MQPerf Dashboard

Execute test

  • Choose your test configuration from the tests directory
  • Use the file name as the test_name in the run_tests.yml file
  • Run the command
ansible-playbook run_tests.yml

Cleaning up

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

  • Stopping sender and receiver processing
ansible-playbook stop.yml
  • Terminating EC2 instances
ansible-playbook shutdown_ec2_instances.yml
  • Removing all MQPerf-related resources on AWS
ansible-playbook remove_aws_resources.yml

Utilities

  • Checking receiver/sender status
ansible-playbook check_status.yml
  • Running sender nodes only
ansible-playbook sender_only.yml
  • Running receiver nodes only
ansible-playbook receiver_only.yml

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

  • when installing Rabbit MQ, you need to specify the Erlang cookie, e.g.: ansible-playbook install_and_setup_rabbitmq.yml -e erlang_cookie=1234
  • management console is available on port 15672 (guest/guest)
  • if you'd like to SSH to the broker servers the user is centos
  • queues starting with ha. will be mirrored

ActiveMQ

  • management console is available on port 8161 (admin/admin)

ActiveMQ Artemis

  • note that for the client code, we are using the same one as for ActiveMQ (ActiveMq.scala)
  • there is no dedicated management console for ActiveMQ Artemis, however monitoring is possible via exposed Jolokia web app. Jolokia web application is deployed along ActiveMQ Artemis by default. To view broker's data:
    • Navigate to: http://<AWS_EC2_PUBLIC_IP>:8161/jolokia/list - plain JSON content should be visible - to verify if it works.
    • To view instance's state navigate to e.g.: http://<AWS_EC2_PUBLIC_IP>:8161/jolokia/read/org.apache.activemq.artemis:address="mq",broker="<BROKER_NAME>",component=addresses, where: org.apache.activemq.artemis:address="mq",broker="<BROKER_NAME>",component=addresses is the key (" signs are obligatory). To know other keys refer to the previous step.
    • <BROKER_NAME> typically resolves to AWS_EC2_PRIVATE_IP with . replaced with _.
  • configuration changes: bumped Xmx, bumped global-max-size

EventStore

  • configuration changes: see the EventStoreMq implementation

Oracle AQ support

  • to build the oracleaq module, first install the required dependencies available in your Oracle DB installation

    • aqapi.jar (oracle/product/11.2.0/dbhome_1/rdbms/jlib/aqapi.jar)
    • ojdbc6.jar (oracle/product/11.2.0/dbhome_1/jdbc/lib/ojdbc6.jar)
  • to install a dependency in your local repository, create a build.sbt file:

organization := "com.oracle"
name := "ojdbc6"
version := "1.0.0"
scalaVersion := "2.11.6"
packageBin in Compile := file(s"${name.value}.jar")

Now you can publish the file. It should be available in ~/.ivy2/local/com.oracle/

$ sbt publishLocal

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

  • I'm getting: skipping: no hosts matched, why? Probably you are running ansible from project root. Instead cd to ansible/ (where ansible.cfg is located) and try to run playbook from this location.

Local test

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

  • parameters:

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

  • environment variables:

RUN_ID=1;HOST_ID=1

More Repositories

1

elasticmq

In-memory message queue with an Amazon SQS-compatible interface. Runs stand-alone or embedded.
Scala
2,379
star
2

sttp

The Scala HTTP client you always wanted!
Scala
1,401
star
3

tapir

Declarative, type-safe web endpoints library
Scala
1,263
star
4

macwire

Lightweight and Nonintrusive Scala Dependency Injection Library
Scala
1,252
star
5

quicklens

Modify deeply nested case class fields
Scala
810
star
6

magnolia

Easy, fast, transparent generic derivation of typeclass instances
Scala
741
star
7

bootzooka

Simple project to quickly start developing a Scala-based microservice or web application, without the need to write login, user registration etc.
Scala
695
star
8

codebrag

Your daily code review tool
Scala
651
star
9

akka-http-session

Web & mobile client-side akka-http sessions, with optional JWT support
Scala
440
star
10

it-cfp-list

List of Call For Papers for IT conferences
374
star
11

retry

because you should never give up, at least not on the first try
Scala
347
star
12

diffx

Pretty diffs for scala case classes
Scala
341
star
13

kmq

Kafka-based message queue
Scala
317
star
14

scala-clippy

Good advice for Scala compiler errors
Scala
315
star
15

supler

Rapid Form Development library. Use your favourite JS frontend & Scala backend frameworks.
Scala
286
star
16

ox

Safe direct-style concurrency and resiliency for Scala on the JVM
Scala
266
star
17

scala-common

Tiny independent libraries with a single purpose, often a single class
Scala
120
star
18

slick-eventsourcing

Example for "Entry level event-sourcing" blog
Scala
118
star
19

lemon-dataset

Lemons quality control dataset
97
star
20

jox

Fast and Scalable Channels in Java
Java
87
star
21

maven-badges

A node.js implementation of https://github.com/jirutka/maven-badges, originally created in ruby.
TypeScript
84
star
22

sbt-softwaremill

A sane set of default build settings
Scala
72
star
23

akka-vs-scalaz

Scala
63
star
24

recursion-training

Recursion schemes training examples and exercises
HTML
59
star
25

scala-sql-compare

Scala
51
star
26

livestub

The HTTP server stub you always wanted!
Scala
50
star
27

stringmask

A micro-library for macro-based case class field masking in .toString
Scala
48
star
28

scala-id-generator

Scala
48
star
29

confluent-playground

Java
44
star
30

odelay

delayed reactions
Scala
42
star
31

sttp-model

Simple Scala HTTP model
Scala
42
star
32

saft

Scala
41
star
33

akka-simple-cluster-k8s

Scala
39
star
34

softwaremill-common

SoftwareMill Common library
Java
37
star
35

walk-that-type

A tool for evaluating TypeScript types step by step.
TypeScript
31
star
36

sttp-openai

Scala
30
star
37

neme-plugin

Scala compiler plugin for turning non exhaustive match warnings into errors
Scala
29
star
38

FoXAI

The open-source library for explainable AI. Generic and easy to integrate with PyTorch.
Python
29
star
39

scala-pre-commit-hooks

Pre-commit/Pre-push hooks for Scala
Python
27
star
40

zio2-structure

Scala
26
star
41

helisa

Scala API for jenetics
Scala
26
star
42

streams-tests

Scala
25
star
43

tapir-loom

Scala
24
star
44

reactive-event-sourcing-java

Java
24
star
45

free-tagless-compare

Free monads compared to tagless final
Scala
22
star
46

node-typescript-starter

A basic boilerplate for node + TypeScript development with debugger source maps support.
TypeScript
22
star
47

akka-http-session-faq

Java
21
star
48

activator-reactive-kafka-scala

Activator template for Reactive Kafka
Scala
20
star
49

sttp-apispec

OpenAPI, AsyncAPI and JSON Schema Scala models.
Scala
20
star
50

scala3-macro-debug

Scala
17
star
51

reactive-streams-for-java-developers

Java
17
star
52

resilience4s

Scala
16
star
53

react-use-promise-matcher

React hooks allowing you to handle promises in a stateful way
TypeScript
16
star
54

simple-http-server

Simple JVM based HTTP server with no dependencies
Scala
15
star
55

correlator

Scala
15
star
56

adopt-tapir

A quickstart generator for Tapir projects
Scala
14
star
57

detectnet-tests

Python scripts and other resources for tesing DetectNet on Nvidia DIGITS
Python
14
star
58

blockchain-schedule

An experimental collaborative planning app based on Ethereum ("Decentralized Doodle")
TypeScript
14
star
59

blog-scala-structure-lifecycle

Scala
12
star
60

akka-sandbox

Training ground for experiments with Akka framework.
Scala
12
star
61

undelay

Satisfy Scala Futures quickly
Scala
11
star
62

broadway-pipelines-blog

Constructing effective data processing workflows using Elixir and Broadway
Elixir
11
star
63

monix-correlation-id

Scala
10
star
64

cassandra-monitoring

Scripts for the Cassandra Monitoring blog miniseries
10
star
65

reason-companies-example

Reason example application
OCaml
10
star
66

jvmbot

Scala
9
star
67

asamal

POC for a CDI-based web lightweight framework
Java
8
star
68

botarium

A simple starter kit for building bots using Node + TypeScript + BotKit.
TypeScript
8
star
69

sbt-template

Scala
8
star
70

boot-scala-microservice

Bootstrap microservice template that uses micro-deps library https://github.com/4finance/micro-deps
Scala
8
star
71

sttp-shared

Scala
7
star
72

modem-connector

Modulator and Demodulator for HAM Radio AX.25 audio signals
Scala
7
star
73

gatling-zeromq

A Gatling stress test plugin for ZeroMQ protocol
Scala
5
star
74

trqbox-demo

Ruby
5
star
75

idea-pastie-plugin

Plugin to post pastie.org pasties from IntelliJ Idea
Java
5
star
76

sentinel-cgan

Sentinel generative conditional adversarial network implementation
Python
5
star
77

scala-compiler-plugin-template

Scala
5
star
78

tapir-serverless

Scala
5
star
79

scalar-conf-website

Scalar - Scala Conference in Central Europe
Python
4
star
80

try-them-off

Showcase service presenting possible usage of the Try monad from Vavr.
Java
4
star
81

slack-alphabet

Scala
4
star
82

sttp-openapi-example

Scala
4
star
83

cache-get-or-create

Java
4
star
84

bootzooka-react

Simple project to quickly start developing a web application using React and Akka HTTP, without the need to write login, user registration etc. https://softwaremill.com/open-source/
Scala
4
star
85

fabrica

Shell
3
star
86

akka-typed-workshop

Scala
3
star
87

scalatimes

Pug
3
star
88

kuberenetes-fundamentals

Training projects to explore k8s features
Scala
3
star
89

play-scala-slick-example-part2

Scala
3
star
90

ansible-bigbluebutton

Shell
3
star
91

kleisli-example

Scala
3
star
92

loom-protect

Java
3
star
93

vehicle-routing-problem-java

Java
3
star
94

supler-example

Example project for Supler http://supler.io
JavaScript
2
star
95

sttp-native-cli

Scala Native with scala-cli and sttp example
Scala
2
star
96

jekyll-softwaremill

SoftwareMill.com website written in Jekyll
PHP
2
star
97

terraform-gke-bootstrap

HCL
2
star
98

functional-pancakes

Scala
2
star
99

aws-demo

Java
2
star
100

gcp-goodies

Source code and other materials for the blog post series - GCP Goodies
Scala
2
star