Ответ 1
Один подход (наш наиболее распространенный шаблон) заключается в том, чтобы сохранить сообщение в его сортированной форме, то есть в виде байтового массива. Для входящих запросов, например. Исправление сообщений, двоичное сообщение, быстро вытаскивается из сети и помещается в кольцевой буфер. Разметка и отправка сообщений различных типов обрабатываются EventProcessors (Потребителями) в этом кольцевом буфере. Для исходящих запросов сообщение сериализуется в предварительно выделенный массив байтов, который формирует запись в кольцевом буфере.
Если вы используете некоторый массив байтов с фиксированным размером в качестве предварительно выделенной записи, для обработки переполнения больших сообщений требуется дополнительная логика. То есть выберите разумный размер по умолчанию, и если он превышен, выделите временный массив, который больше. Затем отбросьте его, когда запись будет повторно использована или использована (в зависимости от вашего варианта использования), возвращаясь к исходному предварительно распределенному массиву байтов.
Если у вас разные потребители для разных типов сообщений, вы можете быстро определить, заинтересован ли ваш потребитель в конкретном сообщении, зная смещение в массив байтов, который несет информацию о типе, или передавая значение дискриминатора через запись.
Также нет правила против создания экземпляров объекта и передачи ссылок (мы делаем это и в нескольких местах). Вы теряете преимущества предварительного распределения объектов, однако одна из целей дизайна искажающего устройства заключалась в том, чтобы позволить пользователю выбирать наиболее подходящую форму хранения.