Is there any way other than MaximumSignalsPerExecution
to have a workflow reject signals?
Basically I have a workflow that periodically continues as new before it timeouts. But if it's continuously getting a lot of signals before it can continue as new, it will end up timing out and losing some signals. I can set MaximumSignalsPerExecution
to be lower so it will reject signals before timing out but ideally I'd like something that could be configured at the workflow level.
I'm testing some worse case scenarios where there is a traffic spike and the workflow would get multiple signals per second.
Firstly, to answer your question: unfortunately there isn’t any other limits that can stop the number of signals being sent. I’m not sure how useful that would be, though. The signal
, start
and signalwithstart
APIs are among the most critical APIs that Cadence users call, because these are the ones that persist data in Cadence. We usually try to keep these APIs as highly available as possible so that we can accept and persist the data that came with these requests. Otherwise, the clients would have to either have a fallback datastore to persist the requests rejected by Cadence, or just propagate failures to their upstream.
The primary benefit of MaximumSignalsPerExecution
limit is to protect the Cadence database from unbounded growth of a single workflow execution. I wouldn’t recommend playing with it just to improve one use case.
The race between signals and ContinueAsNew
is a relatively common problem. I have some ideas to address it, but I don’t think we’ll be able to do it soon due to competing priorities. In the meantime, I think the best thing to do is to set the right expectations for your workflow. Here are two principles that you should keep in mind when designing your workflows:
decision tasks
(ie. how long your workflow reacts to events and decides the next steps) should be very fast, as in milliseconds. This would increase the chance of everything around the workflow to move quickly without blocking each other.In your case, you should look into the following ideas if you haven’t already: