Асинхронный однопоточный vs синхронный многопоточный для разработки сетевого протокола?

Наша команда реализует безопасный многоуровневый одноранговый протокол, который устанавливает соединения между узлами по нескольким промежуточным «перелетам» с использованием Boost/C ++.

В настоящее время мы заблокированы в дискуссии о том, как реализовать дизайн протокола, а именно асинхронную однопоточную или синхронную многопоточную архитектуру.

Я не хочу уклоняться от вопроса, перечисляя плюсы и минусы, но я очень заинтересован в опыте сообщества StackOverFlow в таких вопросах и какой подход они будут одобрять?

Я понимаю, что это открытый вопрос, поэтому в идеале ответ не будет основываться на анекдотических доказательствах, но вытекает из некоторой эмпирической или аналитической основы.

Я бы рекомендовал асинхронный по двум причинам:

* вам не нужно иметь дело с взаимодействиями потоков, которые всегда являются минным полем ошибок;
* вы можете использовать библиотеку  [Boost.Asio](https://www.boost.org/doc/libs/release/doc/html/boost_asio.html)  обрабатывать все низкоуровневое планирование, управление соединениями и т. д. Это также упрощает использование нескольких потоков, если это необходимо для повышения производительности.

Синхронный может быть более простым **, если**  соединения независимы, поэтому нити не должны делиться переменным состоянием. Если вы не можете сделать эту гарантию и убедитесь, что она не изменится в будущем, я бы выбрал асинхронный.