Mike,
The tradeoffs are Consul is CP where Serf is AP. In practice, this means Consul requires a majority
of its servers (2 or 3, 3 of 5) to be available and able to communicate to function. Serf is able to work
under the most extreme of failure conditions. However, to do so, Serf sacrifices consistency meaning
events are delivered out of order and can be lost entirely. Consul has central servers that store all the
state, where Serf agents all have the full cluster state. For small amounts of state that is fine, for large
amounts of K/V you may have 1000x duplication with Serf instead of 3x with Consul.
Consul basically trades being less tolerant of failures for performance improvements, reducing data duplication,
and the ability to provide strong coordination. Serf trades higher level features for being lightweight
and extremely failure tolerant.
The resource requirements of the Consul servers is hard to estimate without knowing the number
of clients, amount of K/V, anticipated query volume, etc. The best bet is to just benchmark your
use case. Generally, writes are IO bounded and reads are CPU bounded. The full Consul data set
must be resident in memory, and you want to have a 1-2x free memory buffer in addition to that.