← Extractions

Multi-region data governance in Rails application

Miron Marczuk's first-ever public tech talk (wroclove.rb 2023) walks through how Apply4 migrated a single-region multi-tenant Rails SaaS into a fully separated multi-region multi-tenant architecture. He covers the decision to fully split applications, a two-stage rollout (first redirecting users via DNS geolocation and load balancer path rules, then bucketing and separating database records and files), and practical go-live advice.

Model
claude-opus-4-7
Ingestion
482550a6
Input tokens
243,430
fresh
133,180
cached
94,500
cache write
15,750
Output tokens
10,902
Duration
168.7s
Roundtrips
7
Tool calls
15
Cost
$0.00
Nodes/edges extracted
25 / 44
Read set (nodes/edges)
102 / 2

Nodes (25)

create Amazon Web Services tool
kind (empty) → tool
name (empty) → Amazon Web Services
slug (empty) → amazon-web-services
attrs (empty) → {"category" => "platform"}
description (empty) → Cloud infrastructure platform used by Apply4 for the multi-region Rails deployment. The app runs in containers on ECS...
short_description (empty) → Amazon's cloud infrastructure platform.
create Amazon ECS tool
kind (empty) → tool
name (empty) → Amazon ECS
slug (empty) → amazon-ecs
attrs (empty) → {"category" => "service"}
description (empty) → AWS managed container orchestration service. Apply4 deploys its Ruby on Rails container to ECS on EC2.
short_description (empty) → AWS managed container orchestration service.
update Miron Marczuk person
attrs (empty) → {"country" => "Poland", "first_talk" => "wroclove.rb 2023"}
description Conference speaker. → Polish Ruby on Rails developer. Works at Apply4 (a permitting SaaS for the film and event industry) through Secret So...
short_description Conference speaker. → Ruby/Rails developer at Apply4 and Secret Source; wroclove.rb 2023 speaker.
update Multi-region data governance in Rails application talk
description Talk at wroclove.rb 2023. → Miron Marczuk's wroclove.rb 2023 talk (his first public tech talk). Tells the story of Apply4's journey from a single...
short_description Talk at wroclove.rb 2023. → wroclove.rb 2023 talk on moving a Rails SaaS from single-region to multi-region multi-tenant.
create Apply4 company
kind (empty) → company
name (empty) → Apply4
slug (empty) → apply4
attrs (empty) → {"industry" => "permitting SaaS / film and event"}
description (empty) → SaaS platform Miron Marczuk works on. Provides permitting software for authorities in the UK, Canada, USA and New Zea...
short_description (empty) → Permitting SaaS platform for the film and event industry.
create Secret Source company
kind (empty) → company
name (empty) → Secret Source
slug (empty) → secret-source
attrs (empty) → {"industry" => "software consulting", "location" => "Gran Canaria"}
description (empty) → Software company with an office in Gran Canaria. Miron Marczuk works at Apply4 through Secret Source.
short_description (empty) → Software company based in Gran Canaria.
create Amazon Route 53 tool
kind (empty) → tool
name (empty) → Amazon Route 53
slug (empty) → amazon-route-53
attrs (empty) → {"category" => "service"}
description (empty) → AWS managed DNS service. Used in Apply4's multi-region migration for geolocation-based routing: the DNS rule resolves...
short_description (empty) → AWS managed DNS service with geolocation routing.
create AWS Elastic Load Balancer tool
kind (empty) → tool
name (empty) → AWS Elastic Load Balancer
slug (empty) → aws-elastic-load-balancer
attrs (empty) → {"category" => "service"}
description (empty) → AWS load balancer used in Apply4's multi-region setup. Configured with path-pattern rules that match the country in t...
short_description (empty) → AWS load balancer with path-pattern redirect rules.
create AWS DataSync tool
kind (empty) → tool
name (empty) → AWS DataSync
slug (empty) → aws-datasync
attrs (empty) → {"category" => "service"}
description (empty) → AWS managed data-transfer service. Recommended by Miron Marczuk for migrating large amounts of files between storage ...
short_description (empty) → AWS managed data-transfer service for files.
create Bucketing concept
kind (empty) → concept
name (empty) → Bucketing
slug (empty) → bucketing
attrs (empty) → {"category" => "pattern"}
description (empty) → Pattern Apply4 used to split a single-region multi-tenant database into per-region databases. An integer 'bucket' col...
short_description (empty) → Tagging each database record with a target region before physically separating tables.
create Default scope for region preview concept
kind (empty) → concept
name (empty) → Default scope for region preview
slug (empty) → default-scope-for-region-preview
attrs (empty) → {"category" => "practice"}
description (empty) → Despite default_scope being widely considered a Rails anti-pattern, Miron recommends it for previewing how each regio...
short_description (empty) → Using Rails default_scope to preview what per-region data will look like.
create Top-down bucketing from Authority concept
kind (empty) → concept
name (empty) → Top-down bucketing from Authority
slug (empty) → top-down-bucketing-from-authority
attrs (empty) → {"category" => "practice"}
description (empty) → Apply4 domain model rooted on an Authority (has a country attribute → region). Bucket assignment starts at each Autho...
short_description (empty) → Assign region buckets starting from the Authority root and walking associations down.
create Table swap via empty copy concept
kind (empty) → concept
name (empty) → Table swap via empty copy
slug (empty) → table-swap-via-empty-copy
attrs (empty) → {"category" => "practice"}
description (empty) → Data-split technique from Apply4: create an empty copy of the source table, insert only the records that should remai...
short_description (empty) → Replace a table by copying wanted rows into an empty clone and renaming.
create Region-aware file paths concept
kind (empty) → concept
name (empty) → Region-aware file paths
slug (empty) → region-aware-file-paths
attrs (empty) → {"category" => "practice"}
description (empty) → File-system split strategy used by Apply4: without changing files themselves, prepend a region-denoting parent folder...
short_description (empty) → Add a region-denoting parent folder to file paths so whole folders can be migrated at once.
create DNS geolocation routing concept
kind (empty) → concept
name (empty) → DNS geolocation routing
slug (empty) → dns-geolocation-routing
attrs (empty) → {"category" => "pattern"}
description (empty) → DNS feature where the resolved IP for a hostname depends on the geographic origin of the requesting resolver. Route 5...
short_description (empty) → DNS returning region-specific IPs based on the requester's origin.
create Gradual migration via steps takeaway
kind (empty) → takeaway
name (empty) → Gradual migration via steps
slug (empty) → gradual-migration-via-steps
attrs (empty) → {"type" => "recommendation"}
description (empty) → Miron's first and most emphasized tip: instead of a single 'leap of faith' deployment that changes everything at once...
short_description (empty) → Break big multi-region migrations into small, deployable stages instead of one leap.
create Use 302 not 301 for region redirects takeaway
kind (empty) → takeaway
name (empty) → Use 302 not 301 for region redirects
slug (empty) → use-302-not-301-for-region-redirects
attrs (empty) → {"type" => "lesson-learned"}
description (empty) → When redirecting users from a region-agnostic URL to a region-specific URL on a load balancer, Apply4 originally used...
short_description (empty) → Chrome caches 301 redirects too aggressively — use 302 for region routing.
create Add SEO alternate links across regions takeaway
kind (empty) → takeaway
name (empty) → Add SEO alternate links across regions
slug (empty) → add-seo-alternate-links-across-regions
attrs (empty) → {"type" => "recommendation"}
description (empty) → Don't forget SEO when splitting a single application into multiple per-region siblings: add the rel=alternate link ta...
short_description (empty) → When splitting an app into regional siblings, add alternate-link tags in the header.
create Three options for multi-region multi-tenant concept
kind (empty) → concept
name (empty) → Three options for multi-region multi-tenant
slug (empty) → three-options-for-multi-region-multi-tenant
attrs (empty) → {"category" => "architecture"}
description (empty) → Framework Miron presents for picking a multi-region architecture: (1) one application, separated data layer — puts al...
short_description (empty) → Separate data only, separate apps fully, or hybrid with shared middle.
create Top-down beats bottom-up for bucketing takeaway
kind (empty) → takeaway
name (empty) → Top-down beats bottom-up for bucketing
slug (empty) → top-down-beats-bottom-up-for-bucketing
attrs (empty) → {"type" => "lesson-learned"}
description (empty) → When assigning region buckets to every record in a tree-like domain, walking top-down from the region-bearing root (A...
short_description (empty) → Starting from the domain root and walking down is simpler and faster than leaf-up.
create Table swap faster than deletion takeaway
kind (empty) → takeaway
name (empty) → Table swap faster than deletion
slug (empty) → table-swap-faster-than-deletion
attrs (empty) → {"type" => "lesson-learned"}
description (empty) → Q&A lesson: copying only the in-region records into an empty clone and renaming tables was measurably faster in the t...
short_description (empty) → Copy wanted rows into an empty clone and rename — faster than deleting unwanted rows.
create Rehearse the go-live takeaway
kind (empty) → takeaway
name (empty) → Rehearse the go-live
slug (empty) → rehearse-the-go-live
attrs (empty) → {"type" => "recommendation"}
description (empty) → Rehearse the entire go-live procedure on staging and locally as many times as possible, including file splits and all...
short_description (empty) → Run the full migration procedure repeatedly on staging/local before touching production.
create Write an explicit go-live runbook takeaway
kind (empty) → takeaway
name (empty) → Write an explicit go-live runbook
slug (empty) → write-an-explicit-go-live-runbook
attrs (empty) → {"type" => "recommendation"}
description (empty) → Go-live advice: inform clients, find a low-usage time (e.g. Saturday 5am), schedule a maintenance window in advance, ...
short_description (empty) → Define exact steps, commands, checks and owners before the maintenance window.
create Cross-region business reporting aggregation question
kind (empty) → question
name (empty) → Cross-region business reporting aggregation
slug (empty) → cross-region-business-reporting-aggregation
attrs (empty) → {"answer_summary" => "Logging is deployed per-region so logs stay local. Cross-region business-report aggregation is ...
description (empty) → Audience asked how Apply4 handles monitoring/logging and business-report aggregation across regions given the promise...
short_description (empty) → How to aggregate business reports across multiple regions without violating data residency.
create Why table swap instead of deletion? question
kind (empty) → question
name (empty) → Why table swap instead of deletion?
slug (empty) → why-table-swap-instead-of-deletion
attrs (empty) → {"answer_summary" => "Both approaches require the same end state, but in Apply4's tests inserting the correct rows in...
description (empty) → Audience asked why Apply4 creates an empty copy of a table, inserts only the in-region rows, and renames, rather than...
short_description (empty) → Why create a fresh table and copy in the wanted rows instead of deleting unwanted rows in place?

Edges (44)

update Miron Marczuk → authored → Multi-region data governance in Rails application
context (empty) → Miron delivered this talk at wroclove.rb 2023 — his first-ever public tech conference talk.
update Multi-region data governance in Rails application → presented_at → wroclove.rb 2023
context (empty) → Talk presented at wroclove.rb 2023 in Wrocław.
create Miron Marczuk → works_at → Apply4
attrs (empty) → {"role" => "developer"}
context (empty) → Works at Apply4 on the permitting SaaS platform, through Secret Source.
relation (empty) → works_at
source_node_id (empty) → e3f3936c-e740-43fc-b9f1-51ccefa2c8a7
target_node_id (empty) → 4f28f943-492c-4ad1-a7ad-8566eb7f4c21
create Miron Marczuk → works_at → Secret Source
context (empty) → Works at Apply4 through Secret Source, which has an office in Gran Canaria.
relation (empty) → works_at
source_node_id (empty) → e3f3936c-e740-43fc-b9f1-51ccefa2c8a7
target_node_id (empty) → 75cd1dcb-0313-486a-8b03-c2d6efed2172
create Miron Marczuk → uses → Ruby on Rails
context (empty) → Apply4's multi-tenant SaaS is a Ruby on Rails application.
relation (empty) → uses
source_node_id (empty) → e3f3936c-e740-43fc-b9f1-51ccefa2c8a7
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Miron Marczuk → uses → Amazon Web Services
context (empty) → Apply4's infrastructure runs on AWS (ECS/EC2, Route 53, load balancers, DataSync).
relation (empty) → uses
source_node_id (empty) → e3f3936c-e740-43fc-b9f1-51ccefa2c8a7
target_node_id (empty) → 5b5f6a0e-b6dd-4a52-90a2-9b1547841cf8
create Apply4 → uses → Ruby on Rails
context (empty) → Apply4's permitting SaaS is a Ruby on Rails application deployed in containers on AWS ECS.
relation (empty) → uses
source_node_id (empty) → 4f28f943-492c-4ad1-a7ad-8566eb7f4c21
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Apply4 → uses → Amazon ECS
context (empty) → Rails application is deployed as a container on AWS ECS (running on EC2).
relation (empty) → uses
source_node_id (empty) → 4f28f943-492c-4ad1-a7ad-8566eb7f4c21
target_node_id (empty) → 314fb680-983d-4973-a89a-700ffa38db4e
create Apply4 → uses → Amazon Route 53
context (empty) → Uses Route 53 geolocation DNS to resolve the region-agnostic URL to the correct regional load balancer.
relation (empty) → uses
source_node_id (empty) → 4f28f943-492c-4ad1-a7ad-8566eb7f4c21
target_node_id (empty) → cf57ef79-15a6-43af-97c8-59843f756395
create Apply4 → uses → AWS Elastic Load Balancer
context (empty) → Uses AWS load balancers with path-pattern rules to redirect requests to the correct region-specific application.
relation (empty) → uses
source_node_id (empty) → 4f28f943-492c-4ad1-a7ad-8566eb7f4c21
target_node_id (empty) → b89ac77b-e07c-4c12-8884-6b0da95a3908
create Apply4 → uses → AWS DataSync
context (empty) → Used AWS DataSync to efficiently copy large batches of files between regions when splitting the file system.
relation (empty) → uses
source_node_id (empty) → 4f28f943-492c-4ad1-a7ad-8566eb7f4c21
target_node_id (empty) → cacf93e4-5752-4f66-9cfd-e1316cf723ff
create Apply4 → uses → Redis
context (empty) → Redis is part of Apply4's persistence layer alongside the database and file system.
relation (empty) → uses
source_node_id (empty) → 4f28f943-492c-4ad1-a7ad-8566eb7f4c21
target_node_id (empty) → 4651221d-1a5e-4989-bac2-017a8b614da1
create Multi-region data governance in Rails application → about → Multi-Tenancy
context (empty) → Starts from a multi-tenant Rails SaaS and extends it to multi-region multi-tenant.
relation (empty) → about
source_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
target_node_id (empty) → f177a107-daa1-4fa3-97fc-23fb1d20f78a
create Multi-region data governance in Rails application → about → Ruby on Rails
context (empty) → Walk-through is specifically about a Rails application migration.
relation (empty) → about
source_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Multi-region data governance in Rails application → about → Bucketing
context (empty) → Central technique of the talk: tag every record with a target region bucket before splitting.
relation (empty) → about
source_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
target_node_id (empty) → 60702c4e-4f40-4920-90fa-9c3c7450f9b4
create Multi-region data governance in Rails application → about → Top-down bucketing from Authority
context (empty) → Talk details top-down bucket assignment starting from the Authority's country.
relation (empty) → about
source_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
target_node_id (empty) → 4115babe-0500-4114-90a7-3c1356f767e8
create Multi-region data governance in Rails application → about → Table swap via empty copy
context (empty) → Explains the empty-copy + rename strategy for separating per-region tables.
relation (empty) → about
source_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
target_node_id (empty) → f8db81a7-0f36-42de-86ab-b0f1d921e07c
create Multi-region data governance in Rails application → about → Region-aware file paths
context (empty) → Covers adding a region-prefix parent folder so files can be relocated in bulk.
relation (empty) → about
source_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
target_node_id (empty) → c1570730-ed3c-48ec-8db7-e7ff7dad9a21
create Multi-region data governance in Rails application → about → DNS geolocation routing
context (empty) → Uses Route 53 geolocation to direct users to the nearest load balancer.
relation (empty) → about
source_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
target_node_id (empty) → da8f3034-d542-4c0e-852e-04321d258929
create Multi-region data governance in Rails application → about → Default scope for region preview
context (empty) → Uses a Rails default_scope on the bucket column to preview per-region data before split.
relation (empty) → about
source_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
target_node_id (empty) → dfb2c6f2-1481-4b1e-9d68-ad805c9a308c
create Multi-region data governance in Rails application → about → Three options for multi-region multi-tenant
context (empty) → Frames the architectural decision around three candidate options.
relation (empty) → about
source_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
target_node_id (empty) → 199258b7-cb43-4bcb-9647-da784a019d69
create Multi-region data governance in Rails application → about → Amazon Route 53
context (empty) → Specifically uses Route 53 geolocation for the first stage of migration.
relation (empty) → about
source_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
target_node_id (empty) → cf57ef79-15a6-43af-97c8-59843f756395
create Multi-region data governance in Rails application → about → AWS Elastic Load Balancer
context (empty) → Path-pattern load balancer redirects handle cross-region URL corrections.
relation (empty) → about
source_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
target_node_id (empty) → b89ac77b-e07c-4c12-8884-6b0da95a3908
create Multi-region data governance in Rails application → about → AWS DataSync
context (empty) → Recommends DataSync for bulk file transfer when splitting millions of files.
relation (empty) → about
source_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
target_node_id (empty) → cacf93e4-5752-4f66-9cfd-e1316cf723ff
create Multi-region data governance in Rails application → about → Apply4
context (empty) → Case study is Apply4's migration from a UK-only to a UK+US multi-region SaaS.
relation (empty) → about
source_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
target_node_id (empty) → 4f28f943-492c-4ad1-a7ad-8566eb7f4c21
create Gradual migration via steps → from_talk → Multi-region data governance in Rails application
context (empty) → Miron's #1 tip — break the migration into deployable stages.
relation (empty) → from_talk
source_node_id (empty) → ae19ec93-2a18-4258-865e-3ac8fdb9df24
target_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
create Use 302 not 301 for region redirects → from_talk → Multi-region data governance in Rails application
context (empty) → Apply4 had to switch from 301 to 302 because Chrome cached 301s too aggressively.
relation (empty) → from_talk
source_node_id (empty) → b6c41700-547e-4748-8048-c529a56cbe45
target_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
create Add SEO alternate links across regions → from_talk → Multi-region data governance in Rails application
context (empty) → Reminder to set alternate-link tags when splitting one app into multiple region-specific siblings.
relation (empty) → from_talk
source_node_id (empty) → ccb5d44f-ca4e-453c-91b4-4ffe2b8109f4
target_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
create Top-down beats bottom-up for bucketing → from_talk → Multi-region data governance in Rails application
context (empty) → Lesson learned while bucketing Apply4 records.
relation (empty) → from_talk
source_node_id (empty) → 76ffd721-f724-4c46-baee-1294f62e7afb
target_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
create Table swap faster than deletion → from_talk → Multi-region data governance in Rails application
context (empty) → Q&A lesson — empty copy + rename was faster than deleting unwanted rows.
relation (empty) → from_talk
source_node_id (empty) → ec9aa4ca-4ba5-45f3-ac9a-294d96251f74
target_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
create Rehearse the go-live → from_talk → Multi-region data governance in Rails application
context (empty) → Miron's explicit go-live recommendation.
relation (empty) → from_talk
source_node_id (empty) → be2197a5-e206-43b2-b791-c1b03046be27
target_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
create Write an explicit go-live runbook → from_talk → Multi-region data governance in Rails application
context (empty) → Miron's go-live planning advice including contingency and DNS-flip trigger.
relation (empty) → from_talk
source_node_id (empty) → c3623d38-cb78-43b8-8fa5-c9a4d4b0b519
target_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
create Cross-region business reporting aggregation → asked_at → Multi-region data governance in Rails application
context (empty) → First Q&A question about logging, analytics aggregation and data-extraction locality.
relation (empty) → asked_at
source_node_id (empty) → 41012275-f521-4f24-a784-5e9ebefa252e
target_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
create Why table swap instead of deletion? → asked_at → Multi-region data governance in Rails application
context (empty) → Second Q&A question asking why Apply4 renames tables instead of deleting unwanted rows in place.
relation (empty) → asked_at
source_node_id (empty) → 51908a99-aed7-4ac9-8e91-13015007c612
target_node_id (empty) → 266bee37-00da-4fde-b418-14aa71db6920
create Cross-region business reporting aggregation → about → Bucketing
context (empty) → Part of the answer explains that data extraction/bucketing happens in the source region.
relation (empty) → about
source_node_id (empty) → 41012275-f521-4f24-a784-5e9ebefa252e
target_node_id (empty) → 60702c4e-4f40-4920-90fa-9c3c7450f9b4
create Why table swap instead of deletion? → about → Table swap via empty copy
context (empty) → Directly about the empty-copy + rename technique used by Apply4.
relation (empty) → about
source_node_id (empty) → 51908a99-aed7-4ac9-8e91-13015007c612
target_node_id (empty) → f8db81a7-0f36-42de-86ab-b0f1d921e07c
create Bucketing → related_to → Multi-Tenancy
context (empty) → Bucketing is applied on a multi-tenant schema where tenants are authorities.
relation (empty) → related_to
source_node_id (empty) → 60702c4e-4f40-4920-90fa-9c3c7450f9b4
target_node_id (empty) → f177a107-daa1-4fa3-97fc-23fb1d20f78a
create Top-down bucketing from Authority → related_to → Bucketing
context (empty) → Top-down traversal is the specific implementation technique for bucket assignment.
relation (empty) → related_to
source_node_id (empty) → 4115babe-0500-4114-90a7-3c1356f767e8
target_node_id (empty) → 60702c4e-4f40-4920-90fa-9c3c7450f9b4
create Table swap via empty copy → related_to → Bucketing
context (empty) → Table swap is the physical separation step that consumes bucket assignments.
relation (empty) → related_to
source_node_id (empty) → f8db81a7-0f36-42de-86ab-b0f1d921e07c
target_node_id (empty) → 60702c4e-4f40-4920-90fa-9c3c7450f9b4
create Region-aware file paths → related_to → Bucketing
context (empty) → File split mirrors the bucketing approach used for database records.
relation (empty) → related_to
source_node_id (empty) → c1570730-ed3c-48ec-8db7-e7ff7dad9a21
target_node_id (empty) → 60702c4e-4f40-4920-90fa-9c3c7450f9b4
create Amazon ECS → related_to → Amazon Web Services
context (empty) → ECS is an AWS service.
relation (empty) → related_to
source_node_id (empty) → 314fb680-983d-4973-a89a-700ffa38db4e
target_node_id (empty) → 5b5f6a0e-b6dd-4a52-90a2-9b1547841cf8
create Amazon Route 53 → related_to → Amazon Web Services
context (empty) → Route 53 is AWS's DNS service.
relation (empty) → related_to
source_node_id (empty) → cf57ef79-15a6-43af-97c8-59843f756395
target_node_id (empty) → 5b5f6a0e-b6dd-4a52-90a2-9b1547841cf8
create AWS Elastic Load Balancer → related_to → Amazon Web Services
context (empty) → ELB is an AWS service.
relation (empty) → related_to
source_node_id (empty) → b89ac77b-e07c-4c12-8884-6b0da95a3908
target_node_id (empty) → 5b5f6a0e-b6dd-4a52-90a2-9b1547841cf8
create AWS DataSync → related_to → Amazon Web Services
context (empty) → DataSync is an AWS service.
relation (empty) → related_to
source_node_id (empty) → cacf93e4-5752-4f66-9cfd-e1316cf723ff
target_node_id (empty) → 5b5f6a0e-b6dd-4a52-90a2-9b1547841cf8

Read set

102 nodes

tool activerecord-multi-tenant search_nodes talk Multi-region data governance in Rails application search_nodes+get_node_edges concept Multi-Tenancy search_nodes takeaway Don't reinvent multi-tenancy — use existing gems search_nodes tool acts_as_tenant search_nodes tool Apartment search_nodes talk Nightmare neighbours caveats of Rails based mutlitenancy search_nodes concept Database-Level Partitioning search_nodes concept Single-Tenant Architecture search_nodes concept Schema-Level Partitioning search_nodes tool Miro search_nodes tool Pundit search_nodes takeaway Name Things To Find Their Properties search_nodes tool Sync Space VR search_nodes project Ruby Romania search_nodes takeaway Buy Faster Hardware search_nodes tool RealtimeBoard search_nodes resource Ironin blog search_nodes tool MobX search_nodes tool Midjourney search_nodes event Rails World search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2023 search_nodes talk Rubyana Gems and the Ractorous Rubetta Stones! search_nodes event wroclove.rb 2018 search_nodes talk Building LLM powered applications in Ruby search_nodes resource Short Ruby Newsletter search_nodes event wroclove.rb 2022 search_nodes talk Scientific Ruby Lightning Talk search_nodes talk Events events events search_nodes project rails_event_store/ecommerce search_nodes project BBC Sport App search_nodes concept Remote EventStorming Split-Merge Structure search_nodes tool AppSignal search_nodes question How do you search across millions of events for top items? search_nodes concept Embrace The Evented Model search_nodes concept Event Store search_nodes concept Command UUID Deduplication search_nodes resource awesome-ddd search_nodes takeaway Be kind and build useful things search_nodes tool Sonic Pi search_nodes resource HotBits search_nodes tool Codecov search_nodes project granite search_nodes project Ruby News search_nodes concept Unique Per-Site Email Leak Detection search_nodes project Petri Nets Performance Prediction Gem search_nodes takeaway Sign serverlessforruby.org petition search_nodes tool AWS Lambda search_nodes resource Rocket Real-Time Benchmark search_nodes takeaway Signed On-the-fly URLs search_nodes tool Amazon Elastic Transcoder search_nodes concept Direct Upload to Cloud search_nodes question Local storage for tests search_nodes tool CockroachDB search_nodes company Transloadit search_nodes tool MinIO search_nodes concept Resumable Uploads search_nodes tool Amazon S3 search_nodes concept tus protocol search_nodes tool CarrierWave search_nodes concept On-Upload Processing search_nodes person Miron Marczuk search_nodes person Adam Okoń search_nodes tool ChatGPT search_nodes tool Redis search_nodes concept Russian Doll Caching search_nodes concept Connection Pool for Redis search_nodes takeaway Keep cache keys simple search_nodes concept Cache Preheating search_nodes question Sidekiq And Redis Cluster search_nodes tool DBM / SDBM / GDBM search_nodes takeaway Cache Clear Hook Killed a Test Suite search_nodes concept HTTP Caching with ETag and Last-Modified search_nodes tool PStore search_nodes tool Ruby on Rails search_nodes concept Cynefin Framework search_nodes project monolith framework search_nodes tool Ember.js search_nodes resource Woman on Rails search_nodes tool Rack search_nodes tool merb search_nodes takeaway Ruby as a Data Management Language search_nodes tool Discourse search_nodes tool dry-container search_nodes takeaway Dockerize Exotic Dependencies search_nodes question Scaling Sidekiq Elastically search_nodes tool Docker search_nodes concept Function as a Service search_nodes concept Serverless search_nodes concept HIPAA search_nodes takeaway Time Travel Superpower search_nodes question How does GDPR deletion work if encrypted events are in backups? search_nodes question Cross-tenant aggregation with row-level multi-tenancy search_nodes concept Data Masking search_nodes concept Data Tokenization search_nodes company Auth0 search_nodes takeaway Contribute to Arkency aggregates repository search_nodes tool actions/upload-artifact search_nodes tool devise_token_auth search_nodes tool Heroku search_nodes resource serverlessforruby.org Petition search_nodes

2 edges