-
Notifications
You must be signed in to change notification settings - Fork 9.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
refactor(core): Map out pubsub messages (no-changelog) #10566
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Overall the approach looks nice. Are we certain that we don't need await
when we publish any of the defined messages? Asking because EventEmitter
interface is sync (by design) and we can't wait for the subscribers to process the events
Correct, we do not await the result of messages pushed into a channel. Publishers send them and they're eventually handled by subscribers. |
n8n Run #6638
Run Properties:
|
Project |
n8n
|
Branch Review |
map-out-pubsub-commands
|
Run status |
Passed #6638
|
Run duration | 04m 40s |
Commit |
9203ac5948: 🌳 🖥️ browsers:node18.12.0-chrome107 🤖 ivov 🗃️ e2e/*
|
Committer | Iván Ovejero |
View all properties for this run ↗︎ |
Test results | |
---|---|
Failures |
0
|
Flaky |
0
|
Pending |
0
|
Skipped |
0
|
Passing |
419
|
View all changes introduced in this branch ↗︎ |
✅ All Cypress E2E specs passed |
* master: ci: Fix provenance generation during NPM publish (no-changelog) (#10586) feat(core): Expose queue metrics for Prometheus (#10559) refactor(core): Map out pubsub messages (no-changelog) (#10566) fix: Fix scenario prefix not being passed (no-changelog) (#10575) refactor(core): Convert `verbose` to `debug` logs (#10574)
Got released with |
* master: (24 commits) feat(core): Switch to MJML for email templates (#10518) fix(Gmail Trigger Node): Don't return date instances, but date strings instead (#10582) fix(core): Deduplicate sentry events using error stacktraces instead (no-changelog) (#10590) feat(editor): Implement new app layout (#10548) refactor(core): Standardize filename casing for services and Public API (no-changelog) (#10579) 🚀 Release 1.57.0 (#10587) fix(editor): Add tooltips to workflow history button (#10570) ci: Fix provenance generation during NPM publish (no-changelog) (#10586) feat(core): Expose queue metrics for Prometheus (#10559) refactor(core): Map out pubsub messages (no-changelog) (#10566) fix: Fix scenario prefix not being passed (no-changelog) (#10575) refactor(core): Convert `verbose` to `debug` logs (#10574) refactor(core): Use `@/databases/` instead of `@db/` (no-changelog) (#10573) ci: Fix destroy benchmark env workflow (no-changelog) (#10572) feat: Add benchmarking of pooled sqlite (no-changelog) (#10550) refactor(editor): User journey link to n8n.io (#10331) fix(Wait Node): Prevent waiting until invalid date (#10523) refactor(core): Standardize filename casing for controllers and databases (no-changelog) (#10564) refactor(core): Allow custom types on getCredentials (no-changelog) (#10567) fix(editor): Scale output item selector input width with value (#10555) ... # Conflicts: # packages/editor-ui/src/stores/assistant.store.ts
In scaling mode, we have two pubsub channels for mains, workers, and webhooks to communicate: the command channel (main to workers, main to mains, main to webhooks) and the response channel (worker to mains).
This pubsub setup has two big areas for improvement:
OrchestrationHandlerService
,OrchestrationHandlerMainService
,OrchestrationHandlerWebhookService
,OrchestrationHandlerWorkerService
,OrchestrationWebhookService
,OrchestrationWorkerService
,OrchestrationService
,RedisService
,RedisServicePubSubSubscriber
,RedisServicePubSubPublisher
,RedisServiceBaseReceiver
,RedisServiceBaseSender
,RedisServiceBase
,RedisClientService
. Our use case does not require this much complexity, so we should aggressively simplify all this to make it easier to reason about.main/handleCommandMessageMain.ts
,main/handleWorkerResponseMessageMain.ts
,worker/handleCommandMessageWorker.ts
,webhook/handleCommandMessageWebhook.ts
We should break all this down into individually unit-testable class methods, e.g. following the model intelemetry-event-relay.ts
andlog-streaming-event-relay.ts
. This will also decouple channel subscription from message handling.To start improving this, specifically the handler side, we can...
This initial PR maps out all pubsub messages and payloads for all interactions between mains, workers, and webhooks. Next steps will be...
main.message-handler.ts
,worker.message-handler.ts
, andwebhook.message-handler.ts
,EventService
and handle it in the relevant handler class, in a unit-tested method, and