Package io.temporal.worker.tuning
Interface SlotSupplier<SI extends SlotInfo>
-
- Type Parameters:
SI
- The type of information that will be used to reserve a slot. The three info types areWorkflowSlotInfo
,ActivitySlotInfo
, andLocalActivitySlotInfo
.
- All Known Implementing Classes:
FixedSizeSlotSupplier
,ResourceBasedSlotSupplier
public interface SlotSupplier<SI extends SlotInfo>
A SlotSupplier is responsible for managing the number of slots available for a given type of task. The three types of tasks are workflow, activity, and local activity. Implementing this interface allows you to carefully control how many tasks of any given type a worker will process at once.
-
-
Method Summary
All Methods Instance Methods Abstract Methods Default Methods Modifier and Type Method Description default java.util.Optional<java.lang.Integer>
getMaximumSlots()
Because we currently use thread pools to execute tasks, there must be *some* defined upper-limit on the size of the thread pool for each kind of task.void
markSlotUsed(SlotMarkUsedContext<SI> ctx)
This function is called once a slot is actually being used to process some task, which may be some time after the slot was reserved originally.void
releaseSlot(SlotReleaseContext<SI> ctx)
This function is called once a permit is no longer needed.SlotPermit
reserveSlot(SlotReserveContext<SI> ctx)
This function is called before polling for new tasks.java.util.Optional<SlotPermit>
tryReserveSlot(SlotReserveContext<SI> ctx)
This function is called when trying to reserve slots for "eager" workflow and activity tasks.
-
-
-
Method Detail
-
reserveSlot
SlotPermit reserveSlot(SlotReserveContext<SI> ctx) throws java.lang.InterruptedException
This function is called before polling for new tasks. Your implementation should block until a slot is available then return a permit to use that slot.- Parameters:
ctx
- The context for slot reservation.- Returns:
- A permit to use the slot which may be populated with your own data.
- Throws:
java.lang.InterruptedException
- The worker may choose to interrupt the thread in order to cancel the reservation, or during shutdown. You may perform cleanup, and then should rethrow the exception.
-
tryReserveSlot
java.util.Optional<SlotPermit> tryReserveSlot(SlotReserveContext<SI> ctx)
This function is called when trying to reserve slots for "eager" workflow and activity tasks. Eager tasks are those which are returned as a result of completing a workflow task, rather than from polling. Your implementation must not block, and If a slot is available, return a permit to use that slot.- Parameters:
ctx
- The context for slot reservation.- Returns:
- Maybe a permit to use the slot which may be populated with your own data.
-
markSlotUsed
void markSlotUsed(SlotMarkUsedContext<SI> ctx)
This function is called once a slot is actually being used to process some task, which may be some time after the slot was reserved originally. For example, if there is no work for a worker, a number of slots equal to the number of active pollers may already be reserved, but none of them are being used yet. This call should be non-blocking.- Parameters:
ctx
- The context for marking a slot as used.
-
releaseSlot
void releaseSlot(SlotReleaseContext<SI> ctx)
This function is called once a permit is no longer needed. This could be because the task has finished, whether successfully or not, or because the slot was no longer needed (ex: the number of active pollers decreased). This call should be non-blocking.- Parameters:
ctx
- The context for releasing a slot.
-
getMaximumSlots
default java.util.Optional<java.lang.Integer> getMaximumSlots()
Because we currently use thread pools to execute tasks, there must be *some* defined upper-limit on the size of the thread pool for each kind of task. You must not hand out more permits than this number. If unspecified, the default isInteger.MAX_VALUE
. Be aware that if your implementation hands out unreasonable numbers of permits, you could easily oversubscribe the worker, and cause it to run out of resources.If a non-empty value is returned, it is assumed to be meaningful, and the worker will emit
MetricsType.WORKER_TASK_SLOTS_AVAILABLE
metrics based on this value.This value should never change during the lifetime of the supplier.
- Returns:
- the maximum number of slots that can ever be in use at one type for this slot type.
-
-