diff --git a/.changeset/spotty-snails-worry.md b/.changeset/spotty-snails-worry.md new file mode 100644 index 0000000000..3ecf2e9b35 --- /dev/null +++ b/.changeset/spotty-snails-worry.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-signals-backend': patch +--- + +The signals backend now supports scaled deployments where clients may be connecting to one of many signal backend instances. diff --git a/plugins/signals-backend/src/service/SignalManager.ts b/plugins/signals-backend/src/service/SignalManager.ts index 995c80ad28..bf20d6a8c4 100644 --- a/plugins/signals-backend/src/service/SignalManager.ts +++ b/plugins/signals-backend/src/service/SignalManager.ts @@ -15,6 +15,7 @@ */ import { EventParams, EventsService } from '@backstage/plugin-events-node'; import { SignalPayload } from '@backstage/plugin-signals-node'; +import crypto from 'crypto'; import { RawData, WebSocket } from 'ws'; import { v4 as uuid } from 'uuid'; import { JsonObject } from '@backstage/types'; @@ -62,10 +63,17 @@ export class SignalManager { } private constructor(options: SignalManagerOptions) { - ({ events: this.events, logger: this.logger } = options); + this.events = options.events; + + // Use a unique subscriber ID for each signals instance, in order to fan-out + // all events to each signals instance. This ensures that events always + // reach users in a scaled deployment. + const id = `signals-${crypto.randomBytes(8).toString('hex')}`; + this.logger = options.logger.child({ subscriberId: id }); + this.logger.info(`Signals manager is subscribing to signals events`); this.events.subscribe({ - id: 'signals', + id, topics: ['signals'], onEvent: (params: EventParams) => this.onEventBrokerEvent(params.eventPayload as SignalPayload),