Multiple Engines

The simplest and safest way to achieve multi-tenancy is to run a separate Axon Ivy Engine installation per tenant or per customer. Doing so brings the following advantages:

  • Security: A separate installation per customer assures that tenants are isolated on the infrastructure level. It is impossible for a customer to see data from another customer due to programming errors or misconfigurations.

  • Scaling: A separate Axon Ivy Engine per tenant is simple to maintain and scales very well. On the other hand, if you run an Axon Ivy Cluster installation and let all customers run on that cluster, you can add more and more nodes to the cluster to handle the additional load. However, the cluster solution cannot scale infinitely. Because adding more nodes induces more communication between the nodes, the network bandwidth available between the cluster nodes limits its growth potential. Adding more nodes at that point makes the cluster slower.

  • Canary Deployments: Introducing new features always carries risks. Instead of rolling out a new feature to all customers in one fell swoop, you provide only a select group of the customers with the new version. If something goes wrong, only that group is affected. With a separate Axon Ivy Engine per tenant, Canary Deployments are easy to implement.

  • Stability: If a customer’s Axon Ivy Engine crashes, only that customer is affected. All other customers are not affected by that crash.

These are the main reasons why we advocate multi-tenancy with isolated Axon Ivy Engine installations. We recommend using container environments such as Docker, Kubernetes or OpenShift that have solved the provisioning cleanly and keep administrative overhead to a minimum.

Get started with our Axon Ivy Engine Docker container here.

digraph engine { layout=neato; node [shape=box, height="0.8", width="2", color="#007095", style=filled, fixedsize="true", margin=0, fontname="Roboto,Helvetica Neue,Arial,sans-serif", fontcolor="white", fontsize=15 ]; /* nodes */ kubernetes [ label="Kubernetes", pos="0,0!" width=7 height=4.7 style="dashed" fontcolor="black" labelloc="t"]; engine1 [ label="Axon Ivy Engine\nContainer Tenant 1", pos="-2,0.0!" width=2 height=4 style="dashed" fontcolor="black" labelloc="t"]; engine2 [ label="Axon Ivy Engine\nContainer Tenant 2", pos="0,0.0!" width=2 height=4 style="dashed" fontcolor="black" labelloc="t"]; engineN [ label="Axon Ivy Engine\nContainer Tenant N", pos="2,0.0!" width=2 height=4 style="dashed" fontcolor="black" labelloc="t"]; users1 [ label="Users", pos="-2,1.2!", width="1.7", height="0.5", style="dashed" fontcolor="black"]; roles1 [ label="Roles", pos="-2,0.5!", width="1.7", height="0.5", style="dashed" fontcolor="black"]; processes1 [ label="Processes", pos="-2,-0.2!", width="1.7", height="0.5"]; tasklist1 [ label="Task list", pos="-2,-0.9!", width="1.7", height="0.5"]; applications1 [ label="Applications", pos="-2,-1.6!", width="1.7", height="0.5"]; users2 [ label="Users", pos="0,1.2!", width="1.7", height="0.5", style="dashed" fontcolor="black"]; roles2 [ label="Roles", pos="0,0.5!", width="1.7", height="0.5", style="dashed" fontcolor="black"]; processes2 [ label="Processes", pos="0,-0.2!", width="1.7", height="0.5"]; tasklist2 [ label="Task list", pos="0,-0.9!", width="1.7", height="0.5"]; applications2 [ label="Applications", pos="0,-1.6!", width="1.7", height="0.5"]; usersN [ label="Users", pos="2,1.2!", width="1.7", height="0.5", style="dashed" fontcolor="black"]; rolesN [ label="Roles", pos="2,0.5!", width="1.7", height="0.5", style="dashed" fontcolor="black"]; processesN [ label="Processes", pos="2,-0.2!", width="1.7", height="0.5"]; tasklistN [ label="Task list", pos="2,-0.9!", width="1.7", height="0.5"]; applicationsN [ label="Applications", pos="2,-1.6!", width="1.7", height="0.5"]; }