Интересует в первую очередь, как такое реализуется на С. Т.е., хотелось бы на некоем DSL задать форматы пакетов и, возможно, логику взаимодействия. Как я понимаю, можно формировать пакеты используя asn1c, либо protobuf, либо Thrift (есть и другие инструменты, но мэйнстрим, как мне показалось, именно эти), сервер можно написать на нём. В других случаях можно использовать, например, ØMQ. А какие ещё возможны варианты?
Про задачи конкретного сервера пока не могу сказать, интересуюсь, скорее, с исследовательской целью.
К сожалению, это не помогает понять, как это правильно сделать. Это примерно как если бы я спросил, как лучше реализовать http-сервер: через select или epoll, ведь можно и просто молча написать.
Внизу я уточнил, про что идёт речь. Задача, по сути, сводится к тому, чтобы сериализовать некоторую структуру С и организовать передачу таких структур. Я представляю, как это работает, но хотелось бы некоторую обёртку над системными вызовами, которая бы упрощала решение данной задачи. Для нагруженных http-серверов, например, используют libev, но это немного не про то, о чём я спрашиваю, но это пример ответа, который я ожидаю.
Ещё было бы интересно узнать впечатления тех, кто пользовался теми или другими из найденных мною инструментов (или предложил ещё какие-то). Я, например, пользовался protobuf и знаком с некоторыми его проблемами (в частности, низкая производительность на больших блоках данных).
Например, реализуется mapreduce. Почему бы для ускорения взаимодействия внутренние операции (перенос чанков с одного шарда на другой) не производить по двоичному протоколу? В данном случае подключается (почти) такой же сервер.
Есть, например потоковое видео, но там немного другие задачи и протоколы уже разработаны, как и сервера, это, конечно, меня интересует меньше.