Skip to content

Synchronized access to MessageService restricts performance #296

@magnusbaeck

Description

@magnusbaeck

Description

The ProducerController synchronizes all calls to the MessageService. This serializes all publish operations and thus has severe performance implications when the rate of incoming requests reaches a certain point. In our case our requests usually take about 35 ms but during our peak hours publishing a single message can take several seconds. This increases the total execution time for our ETOS executions significantly.

Additional Context

The problematic synchronization was added in #219 in an attempt to address a problem with corrupt HTTP responses without addressing the root cause of the poor implementation of MessageServiceRMQImpl. My code review comment in said PR (#219 (comment)) explains the problem but was never addressed.

The following graphs illustrate what we're seeing every night. Note how the request latency shoots up by several orders of magnitude without being constrained by thread pools, CPU, or memory. (The CPU usage on the right y axis of the top-left graph is in millicores.)

image

This serialization also effectively disables the attempt at a connection pool in RabbitMqProperties. Which perhaps is just as well since that class doesn't appear to be very thread safe and that its giveMeRandomChannel method doesn't return a random channel as advertised but actually just returns the first open channel in the list of channels.

Logs

No response

Expected Behavior

I expect Eiffel REMReM Publish to perform well under reasonable loads and that it its performance will be contrained by CPU, memory, thread pool size, and other tunable parameters.

Steps To Reproduce

No response

The version of this project/repo, if applicable

master

The version/edition of the Eiffel Protocol used, if applicable

N/A

Metadata

Metadata

Assignees

Labels

bugSomething is wrong and needs fixing.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions