Ranch 2.0 adds support for multiple connection supervisors.
Ranch 1.x had a bottleneck because it used only a single connection supervisor. This was more evident when many connections were dropped at once as the supervisor couldn’t keep up and failed to accept new connections while cleaning up the old ones. Ranch 2.0 behaves much better in this scenario by default. Multiple connection supervisors also helps with concurrently accepting new connections.
Ranch 2.0 also adds experimental support for opening more than one listening socket on a single port.
Starting with Ranch 2.0 we are also providing a Prometheus collector as a separate project as well as a Grafana dashboard.
Ranch 2.0 is compatible with Erlang/OTP 21.0 onward. Support for Erlang/OTP 19 and 20 has been removed.
ranch.appup file necessary for
performing release upgrades. A test suite has been added
to confirm release upgrades work from one tag to the next.
Numerous fixes were made that will also improve error recovery.
Release upgrades will only be supported from Ranch 2.0
onward.
num_conns_sups option has been added. It allows
configuring the number of connection supervisors. It
now defaults to num_accceptors. The old behavior can
be obtained by setting this value to 1.
logger option is no longer experimental. It now
defaults to logger instead of error_logger.
ranch_server goes down. It is no longer
necessary to embed ranch_sup and the recommendation
is now to just start Ranch normally when using embedded
listeners.
num_listen_sockets option has been
added. It allows opening more than one listening socket
per listener. It can only be used alongside the Linux
SO_REUSEPORT socket option or equivalent. It allows
working around a bottleneck in the kernel and maximizes
resource usage, leading to increased rates for accepting
new connections.
socket option was removed. A more viable solution
is to define a custom transport module that returns a fresh
socket when Transport:listen/1 is called.
Transport:listen/1 and its
implementations in ranch_tcp and ranch_ssl have changed
to accept a map of transport options instead of only
socket options.
Transport:messages/0 return value
now includes the tag used for passive messages.
Socket argument was removed from Protocol:start_link/3.
The socket must now be obtained by calling ranch:handshake/1,2.
ranch:handshake_continue/1,2 and
ranch:handshake_cancel/1 can be used to perform
a two steps handshake. These functions may not be
supported by all transports.
NumAcceptors argument was removed from ranch:start_listener/5
and ranch:child_spec/5 and moved to the transport options.
ranch:opts()
map or only socket options as-is. Individual transport options
are now validated as well. The ranch:opts() map must
be used when socket options also use a map. This applies to the
ranch:start_listener/5, ranch:child_spec/5 and
ranch:set_transport_options/2 functions.
ranch:info/1,2 now returns a map containing
each listener’s information rather than a list of key/values.
The key num_acceptors was removed as it can be found in the
transport options.
ranch:set_transport_options/2 no longer requires
the listener to be suspended. Which options apply immediately,
on suspend/resume or on restart has been documented. Some work
has also been done to make these option changes more predictable.
ranch:accept_ack/1 has been removed in favor
of ranch:handshake/1,2.
ranch:remove_connection/1 will now resume a sleeping
acceptor process when applicable.
ranch:remove_connection/1 from a connection
process would crash the respective connection supervisor. This has
now been fixed.
stampede, a chaos monkey style
testing tool. Currently includes three scenarios: normal
TCP and TLS listeners and embedded TCP listener. This new
test suite helped uncover a misplaced monitor/2 call
added during the development of Ranch 2.0 (we were using a
similar tool, havoc, at the time of finding that issue).
1 + ceil(math:log2(NumChildren))
to allow room for errors when they have many children.
ssl:handshake/1,2,3 instead of
ssl:ssl_accept/1,2.
ranch_ssl:ssl_opt() type has been updated to conform
with Erlang/OTP 23.0.