← 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 MarczukauthoredMulti-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 applicationpresented_atwroclove.rb 2023
context (empty) Talk presented at wroclove.rb 2023 in Wrocław.
create Miron Marczukworks_atApply4
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 Marczukworks_atSecret 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 MarczukusesRuby 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 MarczukusesAmazon 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 Apply4usesRuby 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 Apply4usesAmazon 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 Apply4usesAmazon 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 Apply4usesAWS 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 Apply4usesAWS 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 Apply4usesRedis
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 applicationaboutMulti-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 applicationaboutRuby 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 applicationaboutBucketing
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 applicationaboutTop-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 applicationaboutTable 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 applicationaboutRegion-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 applicationaboutDNS 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 applicationaboutDefault 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 applicationaboutThree 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 applicationaboutAmazon 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 applicationaboutAWS 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 applicationaboutAWS 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 applicationaboutApply4
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 stepsfrom_talkMulti-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 redirectsfrom_talkMulti-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 regionsfrom_talkMulti-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 bucketingfrom_talkMulti-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 deletionfrom_talkMulti-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-livefrom_talkMulti-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 runbookfrom_talkMulti-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 aggregationasked_atMulti-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_atMulti-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 aggregationaboutBucketing
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?aboutTable 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 Bucketingrelated_toMulti-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 Authorityrelated_toBucketing
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 copyrelated_toBucketing
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 pathsrelated_toBucketing
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 ECSrelated_toAmazon 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 53related_toAmazon 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 Balancerrelated_toAmazon 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 DataSyncrelated_toAmazon 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