SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
Making the Most Out of
ScyllaDB’s Awesome
Concurrency at Optimizely
Brian Taylor, Principal Engineer
Brian Taylor
■ I am married with 3 young children
■ I have created 2 programming languages and 2
databases for legitimate business reasons
■ I love discovering some property in the solution space
that, when maintained, makes everything simpler
■ ScyllaDB Loves Concurrency
■ To a point
■ How to keep the wheels on the bus
■ Mommy, where does concurrency come from?
■ Easy way
■ Good way
Presentation Agenda
ScyllaDB Loves
Concurrency
Conceptual Model
Network Execution
S
R
Q
Q Network Q
Q
Client Client
Why Does Concurrency Matter?
S
R
Rtotal
Reff = Rtotal /4 = (R + 3S) / 4
It lets us hide round trip latency!
Throughput - X - measured in things per second (what you probably care about)
Concurrency - N - number of independent requests happening at the same time (the tool of this talk)
Service Time - S - how long ScyllaDB says a thing took
Request Time - R - how long something takes from the client’s perspective
R = S + round trip time
X = 1 / R (pure sequential)
N / R (in the linear region)
X maxX (in the saturation region)
💩 (in the retrograde region)
Definitions
User
User
Classic Closed Loop Load Testing
SUT
User
Request
Response
■ Users can have up to one request in flight at any time
■ Users must receive the response to their request before
issuing the next request
■ Not directly useful for modern capacity planning
Universal Scaling Law
Generalization of Amdahl’s Law discovered by Dr. Neil
Gunther. As number of users (N) increases, the
system throughput (X) will:
■ Enjoy a period of near linear scaling
■ Eventually saturate some resource such that
increasing N doesn’t increase X. This defines
maxX
■ Possibly encounter a coordination cost that
drives down X with further increasing N
Saturation
Region
Linear
Region
ScyllaDB-bench, 3x i3.large,
average throughput vs
concurrency
Retrograde
Region
maxX
Modern Open Loop Load Testing
Constant
Throughput
Source
SUT
Does not model users or think times. Instead models load as a
constant throughput load source. Good match for capacity planning
internet connected systems where we typically know requests per
second but don’t really care how many users are behind that load.
■ The start time of every request in the test is pre-ordained and
does not depend on how the SUT is handling previous requests
■ Concurrency is theoretically unbounded
https://github.com/optimizely/scylla-bench-crate
Closed-loop testing: choose concurrency (N)
Open-loop testing: choose throughput (X)
■ X in the linear region will imply a bounded N (and R is very
stable)
■ X in the saturation region can have unbounded N and R is
very chaotic
■ When X exceeds saturation, N and R are undefined
because the system will not keep up
■ The USL is not a single valued function of X: This has
interesting implications as X approaches saturation
Relating the Testing Models
Network Execution
S
R
Q
Q Network Q
Q
4 kops/s
R99 = 1.487 ms
2 <= N <= 22
40 kops/s
R99 = 2.527 ms
23 <= N <= 255
S99 = 0.634 ms
Independent of
kops/s
Linear Region
Linear Region
Throughput is directly proportional to
concurrency
■ The size of the cluster (in shards) and its
aggregate SSD throughput will determine
how large the linear region is
■ You should engineering your system to
take full advantage of the linear region
SSD Throughput
Allocation
4 kops/s
40 kops/s
Saturation Region
Network Execution
S
R
Q
Q Network Q
Q
100 kops/s
R99 = 17.535 ms
295 <= N <= 2540
S99 is increasing
with runtime
Saturation Region
Throughput is approximately constant, regardless of
concurrency
■ At this point, assuming a well tuned cluster and
workload, we are writing to disk as fast as the
disks can take it
■ Concurrency is no longer a mechanism to
increase throughput and is now becoming a risk
to stability
■ You should engineer your system to stay out of
the saturation region
Saturation
Region
Linear
Region
Retrograde
Region
100 kops/s
Network Execution
Q
Q Network Q
Q
Foreground
Background Execution
Q
Compaction Debt
SSD
SSTable Merges
SSTable
Flushes,
Commit Log
Saturation Region
SSD Throughput
Allocation
Retrograde Region
Network Execution
S
R
Q
Q Network Q
Q
100 kops/s
R99 = 55.8 s
75 <= N <= 4096
Once something
bounces us into the
retrograde region,
S99 becomes 1000x
worse than linear
Retrograde Region
Increasing concurrency now decreases throughput. A
system that enters this region is likely to get stuck
here until demand declines
■ The harder we push, the less throughput we get
and the more demand builds which makes us
want to push harder
■ “Pushing harder” consumes more client
resources (threads, futures, ScyllaDB driver
state). The road to hell will terminate with an
OOM unless there’s some other limiting factor
Saturation
Region
Linear
Region
Retrograde
Region
100 kops/s
Road to hell
Stay in the linear region and you’ll enjoy consistent latencies and bounded concurrency. Stray into
saturation and you’re likely to get stuck in the retrograde region until load subsides.
■ Scale ScyllaDB such that you’re “always” going to be operating in the linear region for your
expected load
■ Design concurrency limiting mechanisms that keep you out of the retrograde region during
unexpected spikes in load
■ If you have work to do and can do it in the linear region: DO IT
What Have We Learned?
Where Does Concurrency
Come From?
These are the boring code wonk answers.
■ Threads
■ Cheap end: 8kb per go-routine. Low thousands is reasonable
■ Expensive end: 1MB per java thread. Low hundreds is reasonable
■ Reactors
■ Rust tokio, java futures, seastar, nodejs callbacks: typically <1kb / instance. Tens of
thousands is reasonable
■ Nodes
■ $$ limited
Mechanisms of Concurrency
Data dependency is the mother of sound concurrency
■ Easy: No dependency: logging facts at independent keys. Write only
■ Medium: Partitionable dependency. As long as we process each independent streams
sequentially, everything will be fine: maintain latest state at a single key
■ Hard: Arbitrary “happens-before” relationships: add a relationship between two nodes in a
graph
Mother of Concurrency
■ Command: Represents an atomic unit of work. Contains IOPs. Always concludes with a write,
may contain reads.
■ IOP: IO Operation. A unit of work for the database.
■ Batch: A group of IOPs that may be executed concurrently. Write IOPs within a batch may
literally be combined into a batch operation to ScyllaDB. Batches execute sequentially with
other batches
■ Slot: A cubby for data. Has a name. Can be read or written (partition + clustering key in
ScyllaDB)
■ Concurrency strategy: How we group IOPs into batches such that the final slot state is
consistent with commands having all been executed sequentially
Definitions
No Dependency
Write A
Command 1 Command 2 Command 4 Command 5
Batch 1
Batch 2
Command 3
Write B Write C
Write D Write E
When commands contain no reads and always write to different slots there can be no data
dependency. The decision about when to switch from batch 1 to 2 can be arbitrary, or driven by
a desire to minimize latency, or to work within the ScyllaDB batch size constraint
For a read/modify/write (RMW) operation to yield correct results, reads must be able to observe the
writes of prior RMWs.
Most streaming platforms (storm, flink, kafka-streams, spark) trivially solve this by partitioning
commands into guaranteed independent streams. This means that:
■ Every command has a happens-before relationship with every following command for the
partition key
■ Cross command concurrency is impossible within a partition
■ Concurrency is limited by the cardinality of the partition key
Read/Modify/Write and “Happens Before”
Command 1
/ Tenant B
Partitioned Concurrency
Read A
Batch 1
Batch 2
Command 2
/ Tenant A
Write B
Read C
The work for each tenant is executed strictly in the order it was received. This guarantees that reads will always
see prior writes but misses opportunities for greater concurrency by being ignorant of non-interacting slot usage
Batch 3
Batch 4 Write B
Read D
Write D
Command 1
/ Tenant A
Happens before Happens before
■ Reads of a slot must be able to observe any writes to that slot that came before them.
■ Writes create a happens-before relationship with any reads that follow them
■ The final value in a slot must reflect last write in the sequence
■ Writes create a happens-before relationship with any writes that follow them
Golden Rules of Data Dependency
Command 1
/ Tenant B
Golden Rule Happens Before
Read A
Batch 1
Batch 2
Command 2
/ Tenant A
Write B
Read C
By examining slot usage and applying the golden rules we can eliminate a batch and get concurrency
within a partition
Batch 3 Write B
Read D
Write D
Command 1
/ Tenant A
Happens before
Each of the golden rules implies a simplification rule that we can use to further compress command
execution
■ Reads of a slot must be able to observe any writes to that slot that came before them.
■ Reads do not have to observe prior writes by literally reading the database
■ The final value in a slot must reflect last write in the sequence
■ If a prior write is not read from the database, it can be omitted as long as the final write
happens
Simplification Rules of Data Dependency
Command 1
/ Tenant B
Data Dependency Simplification
Read A
Batch 1
Batch 2
Command 2
/ Tenant A
Write B
Read C
Reads can directly read prior writes. Overwritten writes can be skipped.
Write B
Read D
Write D
Command 1
/ Tenant A
Happens before
Data dependency is the mother of sound concurrency. If you can find enough sound concurrency in
your problem then you can exploit the full linear region of ScyllaDB’s awesome concurrency.
■ Case 1: 64 cores, thread and partition concurrency. Maximum throughput about 8
kcommands/s. Very sensitive to “data-shape” aka partition cardinality.
■ Case 2: 15 cores, reactor and happens-before concurrency. Maximum throughput about 30
kcommands/s. Insensitive to most practical “data-shape” issues.
What’s the Point?
Thank You
Stay in Touch
Brian Taylor
brian.taylor@optimizely.com
@netguy204
netguy204
www.linkedin.com/in/brian-ttaylor

Más contenido relacionado

Similar a Making the Most Out of ScyllaDB's Awesome Concurrency at Optimizely

To Serverless and Beyond
To Serverless and BeyondTo Serverless and Beyond
To Serverless and BeyondScyllaDB
 
Eventual Consistency @WalmartLabs with Kafka, Avro, SolrCloud and Hadoop
Eventual Consistency @WalmartLabs with Kafka, Avro, SolrCloud and HadoopEventual Consistency @WalmartLabs with Kafka, Avro, SolrCloud and Hadoop
Eventual Consistency @WalmartLabs with Kafka, Avro, SolrCloud and HadoopAyon Sinha
 
Webinar Slides: Tungsten Connector / Proxy – The Secret Sauce Behind Zero-Dow...
Webinar Slides: Tungsten Connector / Proxy – The Secret Sauce Behind Zero-Dow...Webinar Slides: Tungsten Connector / Proxy – The Secret Sauce Behind Zero-Dow...
Webinar Slides: Tungsten Connector / Proxy – The Secret Sauce Behind Zero-Dow...Continuent
 
Flink Forward SF 2017: Stephan Ewen - Experiences running Flink at Very Large...
Flink Forward SF 2017: Stephan Ewen - Experiences running Flink at Very Large...Flink Forward SF 2017: Stephan Ewen - Experiences running Flink at Very Large...
Flink Forward SF 2017: Stephan Ewen - Experiences running Flink at Very Large...Flink Forward
 
Netflix Open Source Meetup Season 4 Episode 2
Netflix Open Source Meetup Season 4 Episode 2Netflix Open Source Meetup Season 4 Episode 2
Netflix Open Source Meetup Season 4 Episode 2aspyker
 
Client Drivers and Cassandra, the Right Way
Client Drivers and Cassandra, the Right WayClient Drivers and Cassandra, the Right Way
Client Drivers and Cassandra, the Right WayDataStax Academy
 
AWS re:Invent 2016: Cross-Region Replication with Amazon DynamoDB Streams (DA...
AWS re:Invent 2016: Cross-Region Replication with Amazon DynamoDB Streams (DA...AWS re:Invent 2016: Cross-Region Replication with Amazon DynamoDB Streams (DA...
AWS re:Invent 2016: Cross-Region Replication with Amazon DynamoDB Streams (DA...Amazon Web Services
 
Architectural Overview of MapR's Apache Hadoop Distribution
Architectural Overview of MapR's Apache Hadoop DistributionArchitectural Overview of MapR's Apache Hadoop Distribution
Architectural Overview of MapR's Apache Hadoop Distributionmcsrivas
 
Extreme HTTP Performance Tuning: 1.2M API req/s on a 4 vCPU EC2 Instance
Extreme HTTP Performance Tuning: 1.2M API req/s on a 4 vCPU EC2 InstanceExtreme HTTP Performance Tuning: 1.2M API req/s on a 4 vCPU EC2 Instance
Extreme HTTP Performance Tuning: 1.2M API req/s on a 4 vCPU EC2 InstanceScyllaDB
 
2009-01-28 DOI NBC Red Hat on System z Performance Considerations
2009-01-28 DOI NBC Red Hat on System z Performance Considerations2009-01-28 DOI NBC Red Hat on System z Performance Considerations
2009-01-28 DOI NBC Red Hat on System z Performance ConsiderationsShawn Wells
 
How to be Successful with Scylla
How to be Successful with ScyllaHow to be Successful with Scylla
How to be Successful with ScyllaScyllaDB
 
DRAM Cell - Working and Read and Write Operations
DRAM Cell - Working and Read and Write OperationsDRAM Cell - Working and Read and Write Operations
DRAM Cell - Working and Read and Write OperationsNaman Bhalla
 
No C-QL (Or how I learned to stop worrying, and love eventual consistency) (N...
No C-QL (Or how I learned to stop worrying, and love eventual consistency) (N...No C-QL (Or how I learned to stop worrying, and love eventual consistency) (N...
No C-QL (Or how I learned to stop worrying, and love eventual consistency) (N...Brian Brazil
 
Functional? Reactive? Why?
Functional? Reactive? Why?Functional? Reactive? Why?
Functional? Reactive? Why?Aleksandr Tavgen
 
DataStax Enterprise – Foundations for Finance – 20160419
DataStax Enterprise – Foundations for Finance – 20160419DataStax Enterprise – Foundations for Finance – 20160419
DataStax Enterprise – Foundations for Finance – 20160419Daniel Cohen
 
Building Scalable, Real Time Applications for Financial Services with DataStax
Building Scalable, Real Time Applications for Financial Services with DataStaxBuilding Scalable, Real Time Applications for Financial Services with DataStax
Building Scalable, Real Time Applications for Financial Services with DataStaxDataStax
 
Spinnaker VLDB 2011
Spinnaker VLDB 2011Spinnaker VLDB 2011
Spinnaker VLDB 2011sandeep_tata
 
MariaDB High Availability
MariaDB High AvailabilityMariaDB High Availability
MariaDB High AvailabilityMariaDB plc
 
Stephan Ewen - Experiences running Flink at Very Large Scale
Stephan Ewen -  Experiences running Flink at Very Large ScaleStephan Ewen -  Experiences running Flink at Very Large Scale
Stephan Ewen - Experiences running Flink at Very Large ScaleVerverica
 

Similar a Making the Most Out of ScyllaDB's Awesome Concurrency at Optimizely (20)

To Serverless and Beyond
To Serverless and BeyondTo Serverless and Beyond
To Serverless and Beyond
 
Eventual Consistency @WalmartLabs with Kafka, Avro, SolrCloud and Hadoop
Eventual Consistency @WalmartLabs with Kafka, Avro, SolrCloud and HadoopEventual Consistency @WalmartLabs with Kafka, Avro, SolrCloud and Hadoop
Eventual Consistency @WalmartLabs with Kafka, Avro, SolrCloud and Hadoop
 
Webinar Slides: Tungsten Connector / Proxy – The Secret Sauce Behind Zero-Dow...
Webinar Slides: Tungsten Connector / Proxy – The Secret Sauce Behind Zero-Dow...Webinar Slides: Tungsten Connector / Proxy – The Secret Sauce Behind Zero-Dow...
Webinar Slides: Tungsten Connector / Proxy – The Secret Sauce Behind Zero-Dow...
 
Flink Forward SF 2017: Stephan Ewen - Experiences running Flink at Very Large...
Flink Forward SF 2017: Stephan Ewen - Experiences running Flink at Very Large...Flink Forward SF 2017: Stephan Ewen - Experiences running Flink at Very Large...
Flink Forward SF 2017: Stephan Ewen - Experiences running Flink at Very Large...
 
Netflix Open Source Meetup Season 4 Episode 2
Netflix Open Source Meetup Season 4 Episode 2Netflix Open Source Meetup Season 4 Episode 2
Netflix Open Source Meetup Season 4 Episode 2
 
Client Drivers and Cassandra, the Right Way
Client Drivers and Cassandra, the Right WayClient Drivers and Cassandra, the Right Way
Client Drivers and Cassandra, the Right Way
 
AWS re:Invent 2016: Cross-Region Replication with Amazon DynamoDB Streams (DA...
AWS re:Invent 2016: Cross-Region Replication with Amazon DynamoDB Streams (DA...AWS re:Invent 2016: Cross-Region Replication with Amazon DynamoDB Streams (DA...
AWS re:Invent 2016: Cross-Region Replication with Amazon DynamoDB Streams (DA...
 
Accordion - VLDB 2014
Accordion - VLDB 2014Accordion - VLDB 2014
Accordion - VLDB 2014
 
Architectural Overview of MapR's Apache Hadoop Distribution
Architectural Overview of MapR's Apache Hadoop DistributionArchitectural Overview of MapR's Apache Hadoop Distribution
Architectural Overview of MapR's Apache Hadoop Distribution
 
Extreme HTTP Performance Tuning: 1.2M API req/s on a 4 vCPU EC2 Instance
Extreme HTTP Performance Tuning: 1.2M API req/s on a 4 vCPU EC2 InstanceExtreme HTTP Performance Tuning: 1.2M API req/s on a 4 vCPU EC2 Instance
Extreme HTTP Performance Tuning: 1.2M API req/s on a 4 vCPU EC2 Instance
 
2009-01-28 DOI NBC Red Hat on System z Performance Considerations
2009-01-28 DOI NBC Red Hat on System z Performance Considerations2009-01-28 DOI NBC Red Hat on System z Performance Considerations
2009-01-28 DOI NBC Red Hat on System z Performance Considerations
 
How to be Successful with Scylla
How to be Successful with ScyllaHow to be Successful with Scylla
How to be Successful with Scylla
 
DRAM Cell - Working and Read and Write Operations
DRAM Cell - Working and Read and Write OperationsDRAM Cell - Working and Read and Write Operations
DRAM Cell - Working and Read and Write Operations
 
No C-QL (Or how I learned to stop worrying, and love eventual consistency) (N...
No C-QL (Or how I learned to stop worrying, and love eventual consistency) (N...No C-QL (Or how I learned to stop worrying, and love eventual consistency) (N...
No C-QL (Or how I learned to stop worrying, and love eventual consistency) (N...
 
Functional? Reactive? Why?
Functional? Reactive? Why?Functional? Reactive? Why?
Functional? Reactive? Why?
 
DataStax Enterprise – Foundations for Finance – 20160419
DataStax Enterprise – Foundations for Finance – 20160419DataStax Enterprise – Foundations for Finance – 20160419
DataStax Enterprise – Foundations for Finance – 20160419
 
Building Scalable, Real Time Applications for Financial Services with DataStax
Building Scalable, Real Time Applications for Financial Services with DataStaxBuilding Scalable, Real Time Applications for Financial Services with DataStax
Building Scalable, Real Time Applications for Financial Services with DataStax
 
Spinnaker VLDB 2011
Spinnaker VLDB 2011Spinnaker VLDB 2011
Spinnaker VLDB 2011
 
MariaDB High Availability
MariaDB High AvailabilityMariaDB High Availability
MariaDB High Availability
 
Stephan Ewen - Experiences running Flink at Very Large Scale
Stephan Ewen -  Experiences running Flink at Very Large ScaleStephan Ewen -  Experiences running Flink at Very Large Scale
Stephan Ewen - Experiences running Flink at Very Large Scale
 

Más de ScyllaDB

Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
What Developers Need to Unlearn for High Performance NoSQL
What Developers Need to Unlearn for High Performance NoSQLWhat Developers Need to Unlearn for High Performance NoSQL
What Developers Need to Unlearn for High Performance NoSQLScyllaDB
 
Low Latency at Extreme Scale: Proven Practices & Pitfalls
Low Latency at Extreme Scale: Proven Practices & PitfallsLow Latency at Extreme Scale: Proven Practices & Pitfalls
Low Latency at Extreme Scale: Proven Practices & PitfallsScyllaDB
 
Dissecting Real-World Database Performance Dilemmas
Dissecting Real-World Database Performance DilemmasDissecting Real-World Database Performance Dilemmas
Dissecting Real-World Database Performance DilemmasScyllaDB
 
Beyond Linear Scaling: A New Path for Performance with ScyllaDB
Beyond Linear Scaling: A New Path for Performance with ScyllaDBBeyond Linear Scaling: A New Path for Performance with ScyllaDB
Beyond Linear Scaling: A New Path for Performance with ScyllaDBScyllaDB
 
Dissecting Real-World Database Performance Dilemmas
Dissecting Real-World Database Performance DilemmasDissecting Real-World Database Performance Dilemmas
Dissecting Real-World Database Performance DilemmasScyllaDB
 
Database Performance at Scale Masterclass: Workload Characteristics by Felipe...
Database Performance at Scale Masterclass: Workload Characteristics by Felipe...Database Performance at Scale Masterclass: Workload Characteristics by Felipe...
Database Performance at Scale Masterclass: Workload Characteristics by Felipe...ScyllaDB
 
Database Performance at Scale Masterclass: Database Internals by Pavel Emelya...
Database Performance at Scale Masterclass: Database Internals by Pavel Emelya...Database Performance at Scale Masterclass: Database Internals by Pavel Emelya...
Database Performance at Scale Masterclass: Database Internals by Pavel Emelya...ScyllaDB
 
Database Performance at Scale Masterclass: Driver Strategies by Piotr Sarna
Database Performance at Scale Masterclass: Driver Strategies by Piotr SarnaDatabase Performance at Scale Masterclass: Driver Strategies by Piotr Sarna
Database Performance at Scale Masterclass: Driver Strategies by Piotr SarnaScyllaDB
 
Replacing Your Cache with ScyllaDB
Replacing Your Cache with ScyllaDBReplacing Your Cache with ScyllaDB
Replacing Your Cache with ScyllaDBScyllaDB
 
Powering Real-Time Apps with ScyllaDB_ Low Latency & Linear Scalability
Powering Real-Time Apps with ScyllaDB_ Low Latency & Linear ScalabilityPowering Real-Time Apps with ScyllaDB_ Low Latency & Linear Scalability
Powering Real-Time Apps with ScyllaDB_ Low Latency & Linear ScalabilityScyllaDB
 
7 Reasons Not to Put an External Cache in Front of Your Database.pptx
7 Reasons Not to Put an External Cache in Front of Your Database.pptx7 Reasons Not to Put an External Cache in Front of Your Database.pptx
7 Reasons Not to Put an External Cache in Front of Your Database.pptxScyllaDB
 
Getting the most out of ScyllaDB
Getting the most out of ScyllaDBGetting the most out of ScyllaDB
Getting the most out of ScyllaDBScyllaDB
 
NoSQL Database Migration Masterclass - Session 2: The Anatomy of a Migration
NoSQL Database Migration Masterclass - Session 2: The Anatomy of a MigrationNoSQL Database Migration Masterclass - Session 2: The Anatomy of a Migration
NoSQL Database Migration Masterclass - Session 2: The Anatomy of a MigrationScyllaDB
 
NoSQL Database Migration Masterclass - Session 3: Migration Logistics
NoSQL Database Migration Masterclass - Session 3: Migration LogisticsNoSQL Database Migration Masterclass - Session 3: Migration Logistics
NoSQL Database Migration Masterclass - Session 3: Migration LogisticsScyllaDB
 
NoSQL Data Migration Masterclass - Session 1 Migration Strategies and Challenges
NoSQL Data Migration Masterclass - Session 1 Migration Strategies and ChallengesNoSQL Data Migration Masterclass - Session 1 Migration Strategies and Challenges
NoSQL Data Migration Masterclass - Session 1 Migration Strategies and ChallengesScyllaDB
 
ScyllaDB Virtual Workshop
ScyllaDB Virtual WorkshopScyllaDB Virtual Workshop
ScyllaDB Virtual WorkshopScyllaDB
 
DBaaS in the Real World: Risks, Rewards & Tradeoffs
DBaaS in the Real World: Risks, Rewards & TradeoffsDBaaS in the Real World: Risks, Rewards & Tradeoffs
DBaaS in the Real World: Risks, Rewards & TradeoffsScyllaDB
 
Build Low-Latency Applications in Rust on ScyllaDB
Build Low-Latency Applications in Rust on ScyllaDBBuild Low-Latency Applications in Rust on ScyllaDB
Build Low-Latency Applications in Rust on ScyllaDBScyllaDB
 
NoSQL Data Modeling 101
NoSQL Data Modeling 101NoSQL Data Modeling 101
NoSQL Data Modeling 101ScyllaDB
 

Más de ScyllaDB (20)

Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
What Developers Need to Unlearn for High Performance NoSQL
What Developers Need to Unlearn for High Performance NoSQLWhat Developers Need to Unlearn for High Performance NoSQL
What Developers Need to Unlearn for High Performance NoSQL
 
Low Latency at Extreme Scale: Proven Practices & Pitfalls
Low Latency at Extreme Scale: Proven Practices & PitfallsLow Latency at Extreme Scale: Proven Practices & Pitfalls
Low Latency at Extreme Scale: Proven Practices & Pitfalls
 
Dissecting Real-World Database Performance Dilemmas
Dissecting Real-World Database Performance DilemmasDissecting Real-World Database Performance Dilemmas
Dissecting Real-World Database Performance Dilemmas
 
Beyond Linear Scaling: A New Path for Performance with ScyllaDB
Beyond Linear Scaling: A New Path for Performance with ScyllaDBBeyond Linear Scaling: A New Path for Performance with ScyllaDB
Beyond Linear Scaling: A New Path for Performance with ScyllaDB
 
Dissecting Real-World Database Performance Dilemmas
Dissecting Real-World Database Performance DilemmasDissecting Real-World Database Performance Dilemmas
Dissecting Real-World Database Performance Dilemmas
 
Database Performance at Scale Masterclass: Workload Characteristics by Felipe...
Database Performance at Scale Masterclass: Workload Characteristics by Felipe...Database Performance at Scale Masterclass: Workload Characteristics by Felipe...
Database Performance at Scale Masterclass: Workload Characteristics by Felipe...
 
Database Performance at Scale Masterclass: Database Internals by Pavel Emelya...
Database Performance at Scale Masterclass: Database Internals by Pavel Emelya...Database Performance at Scale Masterclass: Database Internals by Pavel Emelya...
Database Performance at Scale Masterclass: Database Internals by Pavel Emelya...
 
Database Performance at Scale Masterclass: Driver Strategies by Piotr Sarna
Database Performance at Scale Masterclass: Driver Strategies by Piotr SarnaDatabase Performance at Scale Masterclass: Driver Strategies by Piotr Sarna
Database Performance at Scale Masterclass: Driver Strategies by Piotr Sarna
 
Replacing Your Cache with ScyllaDB
Replacing Your Cache with ScyllaDBReplacing Your Cache with ScyllaDB
Replacing Your Cache with ScyllaDB
 
Powering Real-Time Apps with ScyllaDB_ Low Latency & Linear Scalability
Powering Real-Time Apps with ScyllaDB_ Low Latency & Linear ScalabilityPowering Real-Time Apps with ScyllaDB_ Low Latency & Linear Scalability
Powering Real-Time Apps with ScyllaDB_ Low Latency & Linear Scalability
 
7 Reasons Not to Put an External Cache in Front of Your Database.pptx
7 Reasons Not to Put an External Cache in Front of Your Database.pptx7 Reasons Not to Put an External Cache in Front of Your Database.pptx
7 Reasons Not to Put an External Cache in Front of Your Database.pptx
 
Getting the most out of ScyllaDB
Getting the most out of ScyllaDBGetting the most out of ScyllaDB
Getting the most out of ScyllaDB
 
NoSQL Database Migration Masterclass - Session 2: The Anatomy of a Migration
NoSQL Database Migration Masterclass - Session 2: The Anatomy of a MigrationNoSQL Database Migration Masterclass - Session 2: The Anatomy of a Migration
NoSQL Database Migration Masterclass - Session 2: The Anatomy of a Migration
 
NoSQL Database Migration Masterclass - Session 3: Migration Logistics
NoSQL Database Migration Masterclass - Session 3: Migration LogisticsNoSQL Database Migration Masterclass - Session 3: Migration Logistics
NoSQL Database Migration Masterclass - Session 3: Migration Logistics
 
NoSQL Data Migration Masterclass - Session 1 Migration Strategies and Challenges
NoSQL Data Migration Masterclass - Session 1 Migration Strategies and ChallengesNoSQL Data Migration Masterclass - Session 1 Migration Strategies and Challenges
NoSQL Data Migration Masterclass - Session 1 Migration Strategies and Challenges
 
ScyllaDB Virtual Workshop
ScyllaDB Virtual WorkshopScyllaDB Virtual Workshop
ScyllaDB Virtual Workshop
 
DBaaS in the Real World: Risks, Rewards & Tradeoffs
DBaaS in the Real World: Risks, Rewards & TradeoffsDBaaS in the Real World: Risks, Rewards & Tradeoffs
DBaaS in the Real World: Risks, Rewards & Tradeoffs
 
Build Low-Latency Applications in Rust on ScyllaDB
Build Low-Latency Applications in Rust on ScyllaDBBuild Low-Latency Applications in Rust on ScyllaDB
Build Low-Latency Applications in Rust on ScyllaDB
 
NoSQL Data Modeling 101
NoSQL Data Modeling 101NoSQL Data Modeling 101
NoSQL Data Modeling 101
 

Último

Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 

Último (20)

Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 

Making the Most Out of ScyllaDB's Awesome Concurrency at Optimizely

  • 1. Making the Most Out of ScyllaDB’s Awesome Concurrency at Optimizely Brian Taylor, Principal Engineer
  • 2. Brian Taylor ■ I am married with 3 young children ■ I have created 2 programming languages and 2 databases for legitimate business reasons ■ I love discovering some property in the solution space that, when maintained, makes everything simpler
  • 3. ■ ScyllaDB Loves Concurrency ■ To a point ■ How to keep the wheels on the bus ■ Mommy, where does concurrency come from? ■ Easy way ■ Good way Presentation Agenda
  • 5. Conceptual Model Network Execution S R Q Q Network Q Q Client Client
  • 6. Why Does Concurrency Matter? S R Rtotal Reff = Rtotal /4 = (R + 3S) / 4 It lets us hide round trip latency!
  • 7. Throughput - X - measured in things per second (what you probably care about) Concurrency - N - number of independent requests happening at the same time (the tool of this talk) Service Time - S - how long ScyllaDB says a thing took Request Time - R - how long something takes from the client’s perspective R = S + round trip time X = 1 / R (pure sequential) N / R (in the linear region) X maxX (in the saturation region) 💩 (in the retrograde region) Definitions
  • 8. User User Classic Closed Loop Load Testing SUT User Request Response ■ Users can have up to one request in flight at any time ■ Users must receive the response to their request before issuing the next request ■ Not directly useful for modern capacity planning
  • 9. Universal Scaling Law Generalization of Amdahl’s Law discovered by Dr. Neil Gunther. As number of users (N) increases, the system throughput (X) will: ■ Enjoy a period of near linear scaling ■ Eventually saturate some resource such that increasing N doesn’t increase X. This defines maxX ■ Possibly encounter a coordination cost that drives down X with further increasing N Saturation Region Linear Region ScyllaDB-bench, 3x i3.large, average throughput vs concurrency Retrograde Region maxX
  • 10. Modern Open Loop Load Testing Constant Throughput Source SUT Does not model users or think times. Instead models load as a constant throughput load source. Good match for capacity planning internet connected systems where we typically know requests per second but don’t really care how many users are behind that load. ■ The start time of every request in the test is pre-ordained and does not depend on how the SUT is handling previous requests ■ Concurrency is theoretically unbounded https://github.com/optimizely/scylla-bench-crate
  • 11. Closed-loop testing: choose concurrency (N) Open-loop testing: choose throughput (X) ■ X in the linear region will imply a bounded N (and R is very stable) ■ X in the saturation region can have unbounded N and R is very chaotic ■ When X exceeds saturation, N and R are undefined because the system will not keep up ■ The USL is not a single valued function of X: This has interesting implications as X approaches saturation Relating the Testing Models
  • 12. Network Execution S R Q Q Network Q Q 4 kops/s R99 = 1.487 ms 2 <= N <= 22 40 kops/s R99 = 2.527 ms 23 <= N <= 255 S99 = 0.634 ms Independent of kops/s Linear Region
  • 13. Linear Region Throughput is directly proportional to concurrency ■ The size of the cluster (in shards) and its aggregate SSD throughput will determine how large the linear region is ■ You should engineering your system to take full advantage of the linear region SSD Throughput Allocation 4 kops/s 40 kops/s
  • 14. Saturation Region Network Execution S R Q Q Network Q Q 100 kops/s R99 = 17.535 ms 295 <= N <= 2540 S99 is increasing with runtime
  • 15. Saturation Region Throughput is approximately constant, regardless of concurrency ■ At this point, assuming a well tuned cluster and workload, we are writing to disk as fast as the disks can take it ■ Concurrency is no longer a mechanism to increase throughput and is now becoming a risk to stability ■ You should engineer your system to stay out of the saturation region Saturation Region Linear Region Retrograde Region 100 kops/s
  • 16. Network Execution Q Q Network Q Q Foreground Background Execution Q Compaction Debt SSD SSTable Merges SSTable Flushes, Commit Log Saturation Region SSD Throughput Allocation
  • 17. Retrograde Region Network Execution S R Q Q Network Q Q 100 kops/s R99 = 55.8 s 75 <= N <= 4096 Once something bounces us into the retrograde region, S99 becomes 1000x worse than linear
  • 18. Retrograde Region Increasing concurrency now decreases throughput. A system that enters this region is likely to get stuck here until demand declines ■ The harder we push, the less throughput we get and the more demand builds which makes us want to push harder ■ “Pushing harder” consumes more client resources (threads, futures, ScyllaDB driver state). The road to hell will terminate with an OOM unless there’s some other limiting factor Saturation Region Linear Region Retrograde Region 100 kops/s Road to hell
  • 19. Stay in the linear region and you’ll enjoy consistent latencies and bounded concurrency. Stray into saturation and you’re likely to get stuck in the retrograde region until load subsides. ■ Scale ScyllaDB such that you’re “always” going to be operating in the linear region for your expected load ■ Design concurrency limiting mechanisms that keep you out of the retrograde region during unexpected spikes in load ■ If you have work to do and can do it in the linear region: DO IT What Have We Learned?
  • 21. These are the boring code wonk answers. ■ Threads ■ Cheap end: 8kb per go-routine. Low thousands is reasonable ■ Expensive end: 1MB per java thread. Low hundreds is reasonable ■ Reactors ■ Rust tokio, java futures, seastar, nodejs callbacks: typically <1kb / instance. Tens of thousands is reasonable ■ Nodes ■ $$ limited Mechanisms of Concurrency
  • 22. Data dependency is the mother of sound concurrency ■ Easy: No dependency: logging facts at independent keys. Write only ■ Medium: Partitionable dependency. As long as we process each independent streams sequentially, everything will be fine: maintain latest state at a single key ■ Hard: Arbitrary “happens-before” relationships: add a relationship between two nodes in a graph Mother of Concurrency
  • 23. ■ Command: Represents an atomic unit of work. Contains IOPs. Always concludes with a write, may contain reads. ■ IOP: IO Operation. A unit of work for the database. ■ Batch: A group of IOPs that may be executed concurrently. Write IOPs within a batch may literally be combined into a batch operation to ScyllaDB. Batches execute sequentially with other batches ■ Slot: A cubby for data. Has a name. Can be read or written (partition + clustering key in ScyllaDB) ■ Concurrency strategy: How we group IOPs into batches such that the final slot state is consistent with commands having all been executed sequentially Definitions
  • 24. No Dependency Write A Command 1 Command 2 Command 4 Command 5 Batch 1 Batch 2 Command 3 Write B Write C Write D Write E When commands contain no reads and always write to different slots there can be no data dependency. The decision about when to switch from batch 1 to 2 can be arbitrary, or driven by a desire to minimize latency, or to work within the ScyllaDB batch size constraint
  • 25. For a read/modify/write (RMW) operation to yield correct results, reads must be able to observe the writes of prior RMWs. Most streaming platforms (storm, flink, kafka-streams, spark) trivially solve this by partitioning commands into guaranteed independent streams. This means that: ■ Every command has a happens-before relationship with every following command for the partition key ■ Cross command concurrency is impossible within a partition ■ Concurrency is limited by the cardinality of the partition key Read/Modify/Write and “Happens Before”
  • 26. Command 1 / Tenant B Partitioned Concurrency Read A Batch 1 Batch 2 Command 2 / Tenant A Write B Read C The work for each tenant is executed strictly in the order it was received. This guarantees that reads will always see prior writes but misses opportunities for greater concurrency by being ignorant of non-interacting slot usage Batch 3 Batch 4 Write B Read D Write D Command 1 / Tenant A Happens before Happens before
  • 27. ■ Reads of a slot must be able to observe any writes to that slot that came before them. ■ Writes create a happens-before relationship with any reads that follow them ■ The final value in a slot must reflect last write in the sequence ■ Writes create a happens-before relationship with any writes that follow them Golden Rules of Data Dependency
  • 28. Command 1 / Tenant B Golden Rule Happens Before Read A Batch 1 Batch 2 Command 2 / Tenant A Write B Read C By examining slot usage and applying the golden rules we can eliminate a batch and get concurrency within a partition Batch 3 Write B Read D Write D Command 1 / Tenant A Happens before
  • 29. Each of the golden rules implies a simplification rule that we can use to further compress command execution ■ Reads of a slot must be able to observe any writes to that slot that came before them. ■ Reads do not have to observe prior writes by literally reading the database ■ The final value in a slot must reflect last write in the sequence ■ If a prior write is not read from the database, it can be omitted as long as the final write happens Simplification Rules of Data Dependency
  • 30. Command 1 / Tenant B Data Dependency Simplification Read A Batch 1 Batch 2 Command 2 / Tenant A Write B Read C Reads can directly read prior writes. Overwritten writes can be skipped. Write B Read D Write D Command 1 / Tenant A Happens before
  • 31. Data dependency is the mother of sound concurrency. If you can find enough sound concurrency in your problem then you can exploit the full linear region of ScyllaDB’s awesome concurrency. ■ Case 1: 64 cores, thread and partition concurrency. Maximum throughput about 8 kcommands/s. Very sensitive to “data-shape” aka partition cardinality. ■ Case 2: 15 cores, reactor and happens-before concurrency. Maximum throughput about 30 kcommands/s. Insensitive to most practical “data-shape” issues. What’s the Point?
  • 32. Thank You Stay in Touch Brian Taylor brian.taylor@optimizely.com @netguy204 netguy204 www.linkedin.com/in/brian-ttaylor