[ 
https://issues.apache.org/jira/browse/JAMES-4197?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Benoit Tellier closed JAMES-4197.
---------------------------------
    Resolution: Fixed

> EventSerializersAggregator refactoring
> --------------------------------------
>
>                 Key: JAMES-4197
>                 URL: https://issues.apache.org/jira/browse/JAMES-4197
>             Project: James Server
>          Issue Type: Improvement
>            Reporter: René Cordier
>            Priority: Major
>         Attachments: flamegraph-event-serializers-aggregator.png
>
>          Time Spent: 4h 10m
>  Remaining Estimate: 0h
>
> EventSerializersAggregator relies on exceptions in rder to detect faulty json 
> and pick the right deserializer.
> A certain amount of the CPU is being used just filling stack traces 
> exceptions because of this.
>  !flamegraph-event-serializers-aggregator.png! 
> There could be two approaches here:
> * simple approach: the event serializer interface methods could return 
> Optional, so that we don't hit exceptions anymore in the aggregator 
> serializer for example:
> {code:java}
> public interface EventSerializer {
>     Optional<String> toJson(Event event);
>     Optional<String> toJson(Collection<Event> event);
>     default Optional<byte[]> toJsonBytes(Event event) {
>         return toJson(event).getBytes(StandardCharsets.UTF_8);
>     }
>     default Optional<byte[]> toJsonBytes(Collection<Event> event) {
>         return toJson(event).getBytes(StandardCharsets.UTF_8);
>     }
>     Optional<Event> asEvent(String serialized);
>     Optional<List<Event>> asEvents(String serialized);
>     default Optional<Event> fromBytes(byte[] serialized) {
>         return asEvent(new String(serialized, StandardCharsets.UTF_8));
>     }
>     default Optional<List<Event>> asEventsFromBytes(byte[] serialized) {
>         return asEvents(new String(serialized, StandardCharsets.UTF_8));
>     }
> }
> {code}
> * more complex approach: eventbus could hint the desirializer to be used in 
> the EventBus message payload, the hint can be caried along in the 
> deserializer and help select the right thing without needing to fail a parsing
> {code:java}
> public interface EventSerializer {
>     record StringSerializationResult(String result, Optional<Class<? extends 
> EventSerializer>> serializer) {
>         public BytesSerializationResult asBytes() {
>             return new 
> BytesSerializationResult(result.getBytes(StandardCharsets.UTF_8), serializer);
>         }
>     }
>     record BytesSerializationResult(byte[] result, Optional<Class<? extends 
> EventSerializer>> serializer) {
>     }
>     StringSerializationResult toJson(Event event);
>     StringSerializationResult toJson(Collection<Event> event);
>     default BytesSerializationResult toJsonBytes(Event event) {
>         return toJson(event).asBytes();
>     }
>     default BytesSerializationResult toJsonBytes(Collection<Event> event) {
>         return toJson(event).asBytes();
>     }
>     Event asEvent(String serialized, Optional<Class<? extends 
> EventSerializer>> serializerHint);
>     List<Event> asEvents(String serialized, Optional<Class<? extends 
> EventSerializer>> serializerHint);
>     default Event fromBytes(byte[] serialized, Optional<Class<? extends 
> EventSerializer>> serializerHint) {
>         return asEvent(new String(serialized, StandardCharsets.UTF_8), 
> serializerHint);
>     }
>     default List<Event> asEventsFromBytes(byte[] serialized, Optional<Class<? 
> extends EventSerializer>> serializerHint) {
>         return asEvents(new String(serialized, StandardCharsets.UTF_8), 
> serializerHint);
>     }
> }
> {code}
> Let's give a shot to simple approach first and see if it's enough.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to