@@ -1581,20 +1581,6 @@ export default class ActivityService extends LoggerBase {
15811581 )
15821582 }
15831583
1584- await this . searchSyncWorkerEmitter . triggerMemberSync (
1585- prepared . payload . memberId ,
1586- onboarding ,
1587- prepared . payload . segmentId ,
1588- )
1589-
1590- if ( prepared . payload . objectMemberId ) {
1591- await this . searchSyncWorkerEmitter . triggerMemberSync (
1592- prepared . payload . objectMemberId ,
1593- onboarding ,
1594- prepared . payload . segmentId ,
1595- )
1596- }
1597-
15981584 if ( prepared . payload . organizationId ) {
15991585 await this . redisClient . sAdd (
16001586 'organizationIdsForAggComputation' ,
@@ -1603,6 +1589,28 @@ export default class ActivityService extends LoggerBase {
16031589 }
16041590 }
16051591
1592+ // Deduplicate member sync triggers — a member may appear in many activities in the
1593+ // same batch. Emit once per unique (memberId, segmentId) pair.
1594+ const memberSyncKeys = new Set < string > ( )
1595+ const memberSyncPromises : Promise < void > [ ] = [ ]
1596+ for ( const prepared of preparedForUpsert ) {
1597+ for ( const memberId of [ prepared . payload . memberId , prepared . payload . objectMemberId ] ) {
1598+ if ( ! memberId ) continue
1599+ const key = `${ memberId } :${ prepared . payload . segmentId } `
1600+ if ( ! memberSyncKeys . has ( key ) ) {
1601+ memberSyncKeys . add ( key )
1602+ memberSyncPromises . push (
1603+ this . searchSyncWorkerEmitter . triggerMemberSync (
1604+ memberId ,
1605+ onboarding ,
1606+ prepared . payload . segmentId ,
1607+ ) ,
1608+ )
1609+ }
1610+ }
1611+ }
1612+ await Promise . all ( memberSyncPromises )
1613+
16061614 for ( const prepared of preparedActivities ) {
16071615 resultMap . set ( prepared . resultId , { success : true } )
16081616 }
0 commit comments