Skip to content
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

feat(core): Support bidirectional communication between specific mains and specific workers #10377

Merged
merged 2 commits into from
Aug 20, 2024

Conversation

ivov
Copy link
Contributor

@ivov ivov commented Aug 13, 2024

This PR allows specific a main to message one or more specific workers via a pubsub channel, and for a worker to message specific one or more specific mains via another pubsub channel. This is needed for Val's code execution agents setup - in scaling mode, workers will need to request script execution jobs from mains, and mains will need to send workers the results of those jobs completed by agents so that workers can continue executing.

Context

Scaling mode relies on two pubsub channels for mains and workers to communicate:

  • the command channel
    • for a main to send commands to workers outside the Bull setup, e.g. to ask workers for worker IDs and statuses, to ask workers to reload the license, to ask workers to restart the event bus, to ask workers to reload external secrets providers, etc.
    • for a main to message peers in a multi-main setup, e.g. to add or remove triggers and pollers during leadership transition, to reflect workflow activation events in the UI (enabled, disabled, failed to enable), to relay execution lifecycle events for test webhooks if the main that handled the webhook differs from the main that created the webhook, to install or remove community packages based on what occurred in other mains, etc.
  • the worker response channel
    • for a worker to send back results of commands, only needed by worker view right now

Implementation

In our current setup, we have

  • worker/handleCommandMessageWorker.ts for worker actions in reaction to commands from the main process via the command channel,
  • main/handleCommandMessageMain.ts for main process actions in reaction to messages received from peers via the command channel, and
  • main/handleWorkerResponseMessageMain.ts for main process actions in reaction to responses from workers via the worker response channel.

Main-to-main and worker-to-main communications already support targeting specific recipients, so this PR extends the existing setup to support targeting specific recipients in main-to-worker communications. Please note the existing pubsub implementation needs heavy rework - this PR extends it as little as possible to unblock the agents initiative, until we have time to improve these foundations.

Testing

To test:

  • override the queueModeId for a worker and for a main,
  • add the below snippets to message a specific worker from a main and to message a specific main from a worker,
  • add logs at handleCommandMessageWorker and handleWorkerResponseMessageMain to see the messages, and
  • start both main and worker.
// start.ts - at end of initOrchestration
const redisPublisher = await Container.get(RedisService).getPubSubPublisher();
await redisPublisher.publishToCommandChannel({
	command: 'getId',
	payload: {
		id: '123',
	},
	targets: ['some-worker'], // main: message specific worker
});

// worker.ts - at end of initOrchestration
const redisPublisher = await Container.get(RedisService).getPubSubPublisher();
await redisPublisher.publishToWorkerChannel({
	workerId: this.queueModeId,
	command: 'getId',
	payload: {
		id: '123',
	},
	targets: ['some-main'], // worker: message specific main
});

@n8n-assistant n8n-assistant bot added core Enhancement outside /nodes-base and /editor-ui n8n team Authored by the n8n team labels Aug 13, 2024
@ivov ivov marked this pull request as ready for review August 20, 2024 08:34
Copy link
Contributor

⚠️ Some Cypress E2E specs are failing, please fix them before merging

Copy link

cypress bot commented Aug 20, 2024



Test summary

397 0 0 0Flakiness 1


Run details

Project n8n
Status Passed
Commit 9b7c874
Started Aug 20, 2024 10:15 AM
Ended Aug 20, 2024 10:19 AM
Duration 04:43 💡
OS Linux Debian -
Browser Electron 118

View run in Cypress Cloud ➡️


Flakiness

e2e/14-mapping.cy.ts Flakiness
1 Data mapping > maps expressions from table header

This comment has been generated by cypress-bot as a result of this project's GitHub integration settings. You can manage this integration in this project's settings in the Cypress Cloud

Copy link
Contributor

✅ All Cypress E2E specs passed

@ivov ivov merged commit d0fc9de into master Aug 20, 2024
27 checks passed
@ivov ivov deleted the pay-1835-bidirectional-worker-to-main-communication branch August 20, 2024 10:32
netroy added a commit to netroy/n8n that referenced this pull request Aug 21, 2024
#
[1.56.0](https://github.com/netroy/n8n/compare/n8n@1.55.0...n8n@1.56.0)
(2024-08-20)


### Bug Fixes

* Better errors in Switch, If and Filter nodes
([n8n-io#10457](https://github.com/netroy/n8n/issues/10457))
([aea82cb](aea82cb))
* **core:** Fix payload property in `workflow-post-execute` event
([n8n-io#10413](https://github.com/netroy/n8n/issues/10413))
([d98e29e](d98e29e))
* **core:** Fix XSS validation and separate URL validation
([n8n-io#10424](https://github.com/netroy/n8n/issues/10424))
([91467ab](91467ab))
* **core:** Use explicit types in configs to ensure valid decorator
metadata ([n8n-io#10433](https://github.com/netroy/n8n/issues/10433))
([2043daa](2043daa))
* **editor:** Add workflow scopes when initializing workflow
([n8n-io#10455](https://github.com/netroy/n8n/issues/10455))
([b857c2c](b857c2c))
* **editor:** Buffer json chunks in stream response
([n8n-io#10439](https://github.com/netroy/n8n/issues/10439))
([37797f3](37797f3))
* **editor:** Fix flaky mapping tests
([n8n-io#10453](https://github.com/netroy/n8n/issues/10453))
([fc6d413](fc6d413))
* **editor:** Highlight matching type in filter component
([n8n-io#10425](https://github.com/netroy/n8n/issues/10425))
([6bca879](6bca879))
* **editor:** Show item count in output panel schema view
([n8n-io#10426](https://github.com/netroy/n8n/issues/10426))
([4dee7cc](4dee7cc))
* **editor:** Truncate long data pill labels in schema view
([n8n-io#10427](https://github.com/netroy/n8n/issues/10427))
([1bf2f4f](1bf2f4f))
* Filter component - improve errors
([n8n-io#10456](https://github.com/netroy/n8n/issues/10456))
([61ac0c7](61ac0c7))
* **Google Sheets Node:** Better error when column to match on is empty
([n8n-io#10442](https://github.com/netroy/n8n/issues/10442))
([ce46bf5](ce46bf5))
* **Google Sheets Node:** Update name and hint for useAppend option
([n8n-io#10443](https://github.com/netroy/n8n/issues/10443))
([c5a0c04](c5a0c04))
* **Google Sheets Node:** Update to returnAllMatches option
([n8n-io#10440](https://github.com/netroy/n8n/issues/10440))
([f7fb02e](f7fb02e))
* **Invoice Ninja Node:** Fix payment types
([n8n-io#10462](https://github.com/netroy/n8n/issues/10462))
([129245d](129245d))
* **n8n Form Trigger Node:** Show basic authentication modal on wrong
credentials ([n8n-io#10423](https://github.com/netroy/n8n/issues/10423))
([0dc3e99](0dc3e99))
* **OpenAI Node:** Throw node operations error in case of openAi client
error ([n8n-io#10448](https://github.com/netroy/n8n/issues/10448))
([0d3ed46](0d3ed46))
* Project Viewer always seeing a connection error when testing
credentials ([n8n-io#10417](https://github.com/netroy/n8n/issues/10417))
([613cdd2](613cdd2))
* Remove unimplemented Postgres credentials options
([n8n-io#10461](https://github.com/netroy/n8n/issues/10461))
([17ac784](17ac784))
* Require mfa code to change email
([n8n-io#10354](https://github.com/netroy/n8n/issues/10354))
([39c8e50](39c8e50))
* **Respond to Webhook Node:** Fix issue preventing the chat trigger
from working ([n8n-io#9886](https://github.com/netroy/n8n/issues/9886))
([9d6ad88](9d6ad88))
* Show input names when node has multiple inputs
([n8n-io#10434](https://github.com/netroy/n8n/issues/10434))
([973956c](973956c))


### Features

* **core:** Support bidirectional communication between specific mains
and specific workers
([n8n-io#10377](https://github.com/netroy/n8n/issues/10377))
([d0fc9de](d0fc9de))
* **Facebook Graph API Node:** Update node to support API v18 - v20
([n8n-io#10419](https://github.com/netroy/n8n/issues/10419))
([e7ee10f](e7ee10f))

Co-authored-by: netroy <196144+netroy@users.noreply.github.com>
MiloradFilipovic added a commit that referenced this pull request Aug 21, 2024
* master:
  fix(core): Replace `sanitize-html` with `xss` in XSS validator constraint (#10479)
  refactor(core): Track metrics state and categories in telemetry (no-changelog) (#10483)
  fix: Rename Assistant back (#10481)
  test(editor): Add AI Assistant e2e tests (no-changelog) (#10476)
  feat(core): Support bidirectional communication between specific mains and specific workers (#10377)
  refactor(editor): Add types to global link actions event bus (no-changelog) (#10452)
@github-actions github-actions bot mentioned this pull request Aug 21, 2024
@janober
Copy link
Member

janober commented Aug 21, 2024

Got released with n8n@1.56.0

riascho pushed a commit that referenced this pull request Aug 26, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
core Enhancement outside /nodes-base and /editor-ui n8n team Authored by the n8n team Released
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants