chore(): Emit events in batch and index process event ids in batch (#12097)

**What**
First iteration to prevent events from overwhelming the systems.
- Group emitted event ids when possible instead of creating a message per id which leads to reduced amount of events to process massively in cases of import for example
- Update the index engine to process event data in batches of 100
- Update event handling by the index engine to be able to upsert by batch as well
- Fix index engine build config for intermediate listeners inferrence
This commit is contained in:
Adrien de Peretti
2025-04-08 16:57:08 +00:00
committed by GitHub
parent b05807bfc1
commit 74381addc3
21 changed files with 548 additions and 463 deletions
@@ -26,6 +26,7 @@ import {
MedusaContext,
MedusaError,
MedusaService,
moduleEventBuilderFactory,
Modules,
partitionArray,
} from "@medusajs/framework/utils"
@@ -248,16 +249,15 @@ export default class InventoryModuleService
const toCreate = Array.isArray(input) ? input : [input]
const created = await this.createReservationItems_(toCreate, context)
context.messageAggregator?.saveRawMessageData(
created.map((reservationItem) => ({
eventName: InventoryEvents.RESERVATION_ITEM_CREATED,
source: Modules.INVENTORY,
action: CommonEvents.CREATED,
object: "reservation-item",
context,
data: { id: reservationItem.id },
}))
)
moduleEventBuilderFactory({
action: CommonEvents.CREATED,
object: "reservation-item",
source: Modules.INVENTORY,
eventName: InventoryEvents.RESERVATION_ITEM_CREATED,
})({
data: created,
sharedContext: context,
})
const serializedReservations = await this.baseRepository_.serialize<
InventoryTypes.ReservationItemDTO[] | InventoryTypes.ReservationItemDTO
@@ -350,16 +350,15 @@ export default class InventoryModuleService
)
const result = await this.createInventoryItems_(toCreate, context)
context.messageAggregator?.saveRawMessageData(
result.map((inventoryItem) => ({
eventName: InventoryEvents.INVENTORY_ITEM_CREATED,
source: Modules.INVENTORY,
action: CommonEvents.CREATED,
object: "inventory-item",
context,
data: { id: inventoryItem.id },
}))
)
moduleEventBuilderFactory({
action: CommonEvents.CREATED,
object: "inventory-item",
source: Modules.INVENTORY,
eventName: InventoryEvents.INVENTORY_ITEM_CREATED,
})({
data: result,
sharedContext: context,
})
const serializedItems = await this.baseRepository_.serialize<
InventoryTypes.InventoryItemDTO | InventoryTypes.InventoryItemDTO[]
@@ -406,16 +405,15 @@ export default class InventoryModuleService
const created = await this.createInventoryLevels_(toCreate, context)
context.messageAggregator?.saveRawMessageData(
created.map((inventoryLevel) => ({
eventName: InventoryEvents.INVENTORY_LEVEL_CREATED,
source: Modules.INVENTORY,
action: CommonEvents.CREATED,
object: "inventory-level",
context,
data: { id: inventoryLevel.id },
}))
)
moduleEventBuilderFactory({
action: CommonEvents.CREATED,
object: "inventory-level",
source: Modules.INVENTORY,
eventName: InventoryEvents.INVENTORY_LEVEL_CREATED,
})({
data: created,
sharedContext: context,
})
const serialized = await this.baseRepository_.serialize<
InventoryTypes.InventoryLevelDTO[] | InventoryTypes.InventoryLevelDTO
@@ -462,16 +460,15 @@ export default class InventoryModuleService
const result = await this.updateInventoryItems_(updates, context)
context.messageAggregator?.saveRawMessageData(
result.map((inventoryItem) => ({
eventName: InventoryEvents.INVENTORY_ITEM_UPDATED,
source: Modules.INVENTORY,
action: CommonEvents.UPDATED,
object: "inventory-item",
context,
data: { id: inventoryItem.id },
}))
)
moduleEventBuilderFactory({
action: CommonEvents.UPDATED,
object: "inventory-item",
source: Modules.INVENTORY,
eventName: InventoryEvents.INVENTORY_ITEM_UPDATED,
})({
data: result,
sharedContext: context,
})
const serializedItems = await this.baseRepository_.serialize<
InventoryTypes.InventoryItemDTO | InventoryTypes.InventoryItemDTO[]
@@ -503,16 +500,15 @@ export default class InventoryModuleService
context
)
context.messageAggregator?.saveRawMessageData(
result[0].map((inventoryLevel) => ({
eventName: InventoryEvents.INVENTORY_LEVEL_DELETED,
source: Modules.INVENTORY,
action: CommonEvents.DELETED,
object: "inventory-level",
context,
data: { id: inventoryLevel.id },
}))
)
moduleEventBuilderFactory({
action: CommonEvents.DELETED,
object: "inventory-level",
source: Modules.INVENTORY,
eventName: InventoryEvents.INVENTORY_LEVEL_DELETED,
})({
data: result[0],
sharedContext: context,
})
return result
}
@@ -524,6 +520,7 @@ export default class InventoryModuleService
* @param context
*/
@InjectTransactionManager()
@EmitEvents()
async deleteInventoryLevel(
inventoryItemId: string,
locationId: string,
@@ -535,13 +532,14 @@ export default class InventoryModuleService
context
)
context.messageAggregator?.saveRawMessageData({
eventName: InventoryEvents.INVENTORY_LEVEL_DELETED,
source: Modules.INVENTORY,
moduleEventBuilderFactory({
action: CommonEvents.DELETED,
object: "inventory-level",
context,
source: Modules.INVENTORY,
eventName: InventoryEvents.INVENTORY_LEVEL_DELETED,
})({
data: { id: inventoryLevel.id },
sharedContext: context,
})
if (!inventoryLevel) {
@@ -579,16 +577,15 @@ export default class InventoryModuleService
const levels = await this.updateInventoryLevels_(input, context)
context.messageAggregator?.saveRawMessageData(
levels.map((inventoryLevel) => ({
eventName: InventoryEvents.INVENTORY_LEVEL_UPDATED,
source: Modules.INVENTORY,
action: CommonEvents.UPDATED,
object: "inventory-level",
context,
data: { id: inventoryLevel.id },
}))
)
moduleEventBuilderFactory({
action: CommonEvents.UPDATED,
object: "inventory-level",
source: Modules.INVENTORY,
eventName: InventoryEvents.INVENTORY_LEVEL_UPDATED,
})({
data: levels,
sharedContext: context,
})
const updatedLevels = await this.baseRepository_.serialize<
InventoryTypes.InventoryLevelDTO | InventoryTypes.InventoryLevelDTO[]
@@ -662,16 +659,15 @@ export default class InventoryModuleService
const update = Array.isArray(input) ? input : [input]
const result = await this.updateReservationItems_(update, context)
context.messageAggregator?.saveRawMessageData(
result.map((reservationItem) => ({
eventName: InventoryEvents.RESERVATION_ITEM_UPDATED,
source: Modules.INVENTORY,
action: CommonEvents.UPDATED,
object: "reservation-item",
context,
data: { id: reservationItem.id },
}))
)
moduleEventBuilderFactory({
action: CommonEvents.UPDATED,
object: "reservation-item",
source: Modules.INVENTORY,
eventName: InventoryEvents.RESERVATION_ITEM_UPDATED,
})({
data: result,
sharedContext: context,
})
const serialized = await this.baseRepository_.serialize<
InventoryTypes.ReservationItemDTO | InventoryTypes.ReservationItemDTO[]
@@ -867,16 +863,15 @@ export default class InventoryModuleService
context
)
context.messageAggregator?.saveRawMessageData(
reservations.map((reservationItem) => ({
eventName: InventoryEvents.RESERVATION_ITEM_DELETED,
source: Modules.INVENTORY,
action: CommonEvents.DELETED,
object: "reservation-item",
context,
data: { id: reservationItem.id },
}))
)
moduleEventBuilderFactory({
action: CommonEvents.DELETED,
object: "reservation-item",
source: Modules.INVENTORY,
eventName: InventoryEvents.RESERVATION_ITEM_DELETED,
})({
data: reservations,
sharedContext: context,
})
await this.adjustInventoryLevelsForReservationsDeletion(
reservations,
@@ -909,16 +904,15 @@ export default class InventoryModuleService
context
)
context.messageAggregator?.saveRawMessageData(
reservations.map((reservationItem) => ({
eventName: InventoryEvents.RESERVATION_ITEM_DELETED,
source: Modules.INVENTORY,
action: CommonEvents.DELETED,
object: "reservation-item",
context,
data: { id: reservationItem.id },
}))
)
moduleEventBuilderFactory({
action: CommonEvents.DELETED,
object: "reservation-item",
source: Modules.INVENTORY,
eventName: InventoryEvents.RESERVATION_ITEM_DELETED,
})({
data: reservations,
sharedContext: context,
})
}
/**
@@ -946,16 +940,15 @@ export default class InventoryModuleService
context
)
context.messageAggregator?.saveRawMessageData(
reservations.map((reservationItem) => ({
eventName: InventoryEvents.RESERVATION_ITEM_CREATED,
source: Modules.INVENTORY,
action: CommonEvents.CREATED,
object: "reservation-item",
context,
data: { id: reservationItem.id },
}))
)
moduleEventBuilderFactory({
action: CommonEvents.CREATED,
object: "reservation-item",
source: Modules.INVENTORY,
eventName: InventoryEvents.RESERVATION_ITEM_CREATED,
})({
data: reservations,
sharedContext: context,
})
}
/**
@@ -1016,13 +1009,14 @@ export default class InventoryModuleService
)
results.push(result)
context.messageAggregator?.saveRawMessageData({
eventName: InventoryEvents.INVENTORY_LEVEL_UPDATED,
source: Modules.INVENTORY,
moduleEventBuilderFactory({
action: CommonEvents.UPDATED,
object: "inventory-level",
context,
source: Modules.INVENTORY,
eventName: InventoryEvents.INVENTORY_LEVEL_UPDATED,
})({
data: { id: result.id },
sharedContext: context,
})
}