С нескольких недель мы используем Storm в нашем проекте. Сегодня мы обнаружили очень странное поведение. Давайте предположим, что мы имеем следующую топологию:Apache Storm: Mutable Объект, испускаемый для разных болтов.
SpoutA ---> BoltB
---> BoltC
Итак, мы имеем SpoutA, испускающий пользовательский объект Java (давайте назовем это сообщение) для двух различных болтов. BoltB и BoltC. В принципе, мы выполняем раскол.
До сегодняшнего дня мы предположили, что если SpoutA испускает объект сообщения, он сериализуется на SpoutA и десериализуется на BoltB, а также на BoltC. Однако это предположение кажется неправильным. Сегодня мы обнаружили, что десериализованный объект в BoltB идентичен (Same System.identitfyHashCode) объекту в BoltC. Другими словами, если я манипулирую объектом в BoltB, я также манипулирую объектом Object в BoltC, что приводит к множеству непредвиденных побочных эффектов.
Кроме того, это поведение кажется мне очень странным, поскольку оно применяется только в том случае, если SpoutA и соответствующие болты B и C работают у одного и того же работника. Если я явно принудительно использую три произведения, тогда объект (как и ожидалось) представляет собой другой объект для BoltB и для BoltC, поскольку он используется в разных JVM. Следовательно, если мы предположим, что у нас есть более крупная топология (50 различных болтов), работающая на трех рабочих, тогда мы никогда не сможем быть уверены, что объекты в настоящее время разделены между болтами или нет.
Итак, мы действительно НЕ хотим, чтобы объект был разделен между болтами. Обычно мы ожидаем, что во время десериализации новые новые объекты создаются для каждого из болтов.
Итак, вот мой вопрос: Какие здесь основные недостатки? Является ли наш главный недостаток испусканием «изменчивых» объектов? Неправильно ли мы используем сериализацию/десериализацию? Или это может быть дизайнерский недостаток шторма?
Очевидно, что мы могли бы заставить создавать новые объекты, просто испуская байт-массивы, но, на мой взгляд, это противоречит Шторму.
С наилучшими пожеланиями, Андре
В настоящее время мы выполняем 40-штурмовой штормовой процесс на нашей продукции, и у нас была более тонкая проблема, поэтому, когда мы разбираем объект с одного болта на другой, мы используем сериализацию xml и он будет передаваться как строка xml. он решает нашу проблему –
Да, мы также подумали о реализации нашей собственной сериализации/десериализации (но затем на уровне байта). Другое решение будет явно определять передаваемые объекты как непреложные по соглашению. Тем не менее, я надеялся, что может быть лучшее решение (например, просто настройка, чтобы заставить шторм десериализовать объекты отдельно ...) – Vion
да агрегированы, вы можете пойти с ними в опции –