We call running a FsShelter topology entirely inside a .NET process "self-hosting". The feature simulates Storm cluster and can be used for testing or production deployments where scale-out capability of Storm is not required. The 2.0 release of FsShelter reimplements this feature using the same technology Storm does - Disruptor queues, greatly improving the performance and further reducing overhead.


  • only FsShelter components can be self-hosted, no shell or java;
  • tuple timeouts are not enforced;
  • only does in-proc message passing - can't scale out.


  • Self-hosted F# components perform on par with native JVM components under Storm, while taking as little as 30MB and ~20 threads.
  • no Storm, zookeeper or even JRE are required, while delivering the same processing guarantees.

Start small then scale out to run on a cluster, with no changes to your code! Use the same building blocks that run in the cloud... anywhere!

For details refer to the Guaranteed sample, which demonstrates how to run the topology either way.


This release greately improves diagnostics when self-hosting a topology:

  • TOPOLOGY_DEBUG flag can be set on individual components to selectively analyse the traffic.
  • settting the debug flag globally will also trace the system and acker components.
  • setting the flag will also trace the time spend in the body of your function.

Relevant Configuration options

  • withParallelism has the same effect as in Storm.
  • TOPOLOGY_MULTILANG_SERIALIZER has no effect, as self-hosting does not serialize.
  • TOPOLOGY_MAX_SPOUT_PENDING has the same effect as in Storm.
  • TOPOLOGY_MESSAGE_TIMEOUT_SECS determines how long the runtime will wait before starting the flow of tuples and after shutdown command.
  • TOPOLOGY_EXECUTOR_RECEIVE_BUFFER_SIZE determins the size of the ring-buffers for your components. Higher backpressure water-mark, may need higher ring-buffer size to avoid deadlock.
  • TOPOLOGY_ACKER_EXECUTORS number has the same effect as in Storm - increasing this number may improve guaranteed throughput at the cost of increased resource consumption.
Fork me on GitHub