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

Claus Ibsen updated CAMEL-25737:
--------------------------------
    Fix Version/s: 4.25.0
                       (was: 4.24.0)

> camel-aws2-sqs - extendMessageVisibility with a visibilityTimeout below 2 
> seconds delivers messages again while they are processed
> ----------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25737
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25737
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-aws2-sqs
>            Reporter: Claus Ibsen
>            Assignee: Claus Ibsen
>            Priority: Minor
>             Fix For: 4.25.0
>
>
> With {{extendMessageVisibility=true}} the consumer's timeout extender runs 
> every {{max(1, visibilityTimeout / 2)}} whole seconds, and it extends a 
> message only once 80 % of its visibility timeout has passed. That leaves this 
> much time between an extension and the moment the message becomes visible 
> again:
> ||visibilityTimeout||extender period||left before expiry||
> |1|1 s|*0 s* (always late)|
> |2|1 s|1 s|
> |3|1 s|1 s|
> |4|2 s|2 s|
> |5|2 s|1 s|
> |6|3 s|3 s|
> |8|4 s|4 s|
> |10|5 s|5 s|
> With {{visibilityTimeout=1}} every extension after the first arrives exactly 
> when the message becomes visible again, so SQS answers {{MessageNotInflight}} 
> and another consumer receives the message while the first one still processes 
> it. A seeded simulation of the consumer against a fake SQS queue showed this 
> in 876 of 2000 runs on main with 2 or 3 concurrent consumers. Values from 2 
> to 9 work, but with a margin of only 1 to 2 seconds, which network latency, a 
> GC pause or a busy extender (one thread, batches of 10) can use up.
> Also, {{visibilityTimeout=0}} (or negative) passes the existing check in 
> {{Sqs2Component}}, and the consumer then silently does not create the 
> extender ({{Sqs2Consumer}}, {{visibilityTimeout > 0}}), so 
> {{extendMessageVisibility}} is ignored.
> Proposed:
> # Fail at startup when {{extendMessageVisibility=true}} and 
> {{visibilityTimeout < 2}}, next to the existing check that 
> {{visibilityTimeout}} is set.
> # Log a WARN at startup when {{extendMessageVisibility=true}} and 
> {{visibilityTimeout < 10}}: the extender leaves only a 1 to 2 second margin.
> # Document on both options that a visibility timeout of 10 seconds or more is 
> recommended with {{extendMessageVisibility}}, and add a note to the 4.24 
> upgrade guide for the new startup failure.
> Out of scope (possible follow-up): scheduling the extender in milliseconds 
> ({{visibilityTimeout * 1000 / 2}}) would remove the rounding and give a 50 % 
> margin for every value, but it changes the timing for all users.
> _Claude Code on behalf of Claus Ibsen_



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to