Question

My Akka FSM actor has the need to prioritize messages dependent on type. To be specific, the actor receives messages in one of these categories, in prioritized order:

  1. Messages that triggers state transitions
  2. Messages that query the current state
  3. Messages that causes the actor to perform some work ("WorkMsg")

According to the Akka docs, messages can be prioritized according to the list above with a PriorityExecutorBasedEventDrivenDispatcher containing a PriorityGenerator. I've implemented the FSM actor with this dispatcher and it works well.

The problem is that this dispatcher also reorders WorkMsgs, which is not what I want.

WorkMsgs contain a timestamp and are sent to the FSM actor sorted by this timestamp. When the FSM actor processes WorkMsgs, it discards WorkMsgs that are older than the previous WorkMsg. So if these are reordered, I lose data.

Without the PriorityExecutorBasedEventDrivenDispatcher, WorkMsgs are not reordered, but then the priorities in the list above are not satisfied.

How can I maintain the priorities in the list above, while preventing reordering of messages of the same priority?

Was it helpful?

Solution

A prioritizing proxy actor can prioritize messages to be sent to your worker actor. You will have to sort and store the incoming messages as well as implement the prioritization logic. The worker will additionally have to respond to the proxy after each message to let it know that it is ready for more work.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top