All blogs / Distributed systems / cloud
Jack Vanlightly
{ dist sys, formal verification, event streaming }
Distributed systems / cloudDatabasesPerformance / optimization
- Posts
- 208 from 4 Jan 2016 to 28 Aug 2026
- Posting
- monthly (21 in the last year)
- Kind
- personal blog
- Feed
- https://jack-vanlightly.com/blog?format=rss
2026 14
- The AtomicLog + LogDrive: Strong vs weak sealing
- The LogDrive: Flexible Composition Through Abstraction in Shared Logs
- Apache Kafka performance #1 - linger.ms
- 1BRC on a Threadripper 9980X
- Benchmarking Hardwood 1.0 on a Threadripper 9980X
- Kafka Share Groups - Pathological fetch waits with record_limit
- Can We Agree on a Storage/Workload Architecture Taxonomy?
- Raise the ambition threshold
- Kafka Share Groups and Parallelizing Consumption - Part 3: Client-local parallelism
- Broker-Visible vs Client-Local Parallelism
- Kafka Share Groups and Parallelizing Consumption - Part 2: Producer Batches and share.acquire.mode
- Kafka Share Groups and Parallelizing Consumption — Part 1: Tuning max.poll.records
- Benchmarking Apache Kafka Consumer Groups vs Share Groups (overhead test)
- Introducing Dimster, a performance benchmarking tool for Apache Kafka
2025 28
- The Three Durable Function Forms
- The Durable Function Tree - Part 2
- The Durable Function Tree - Part 1
- Coordinated Progress
- Demystifying Determinism in Durable Execution
- Have your Iceberg Cubed, Not Sorted: Meet Qbeast, the OTree Spatial Index
- How Would You Like Your Iceberg Sir? Stream or Batch Ordered?
- A Fork in the Road: Deciding Kafka’s Diskless Future — Jack Vanlightly
- Why I’m not a fan of zero-copy Apache Kafka-Apache Iceberg — Jack Vanlightly
- Beyond Indexes: How Open Table Formats Optimize Query Performance — Jack Vanlightly
- Understanding Apache Fluss — Jack Vanlightly
- table formats internals blog posts
- A Conceptual Model for Storage Unification — Jack Vanlightly
- Remediation: What happens after AI goes wrong? — Jack Vanlightly
- The Cost of Being Wrong — Jack Vanlightly
- Responsibility Boundaries in the Coordinated Progress model — Jack Vanlightly
- Coordinated Progress – Part 3 – Coupling, Synchrony and Complexity — Jack Vanlightly
- Coordinated Progress – Part 4 – A Loose Decision Framework — Jack Vanlightly
- Coordinated Progress – Part 2 – Making Progress Reliable
- Log Replication Disaggregation Survey - Apache Pulsar and BookKeeper
- Log Replication Disaggregation Survey - Kafka Replication Protocol
- Log Replication Disaggregation Survey - Neon and MultiPaxos
- Towards composable data platforms
- How to disaggregate a log replication protocol
- Steady on! Separating Failure-Free Ordering from Fault-Tolerant Consensus
- An Introduction to Virtual Consensus in Delos
- Why Snowflake wants streaming
- AI Agents in 2025
2024 48
- Verifying Kafka transactions - Diary entry 5 - AddPartitionsToTxn in TLA+
- On 1 million page views
- To be atomic or non-atomic, that is the question (Fizzbee)
- Verifying Kafka transactions - Diary entry 4 - Writing an initial Fizzbee spec
- An introduction to symmetry in TLA+
- Verifying Kafka transactions - Diary entry 3 - Getting confidence in the TLA+ spec
- Verifying Kafka transactions - Diary entry 2 - Writing an initial TLA+ spec
- Verifying Kafka transactions - Diary entry 1 - A first step
- Dismantling ELT: The Case for Graphs, Not Silos
- The Law of Large Numbers: A Foundation for Statistical Modeling in Distributed Systems
- Obtaining statistical properties through modeling and simulation
- Incremental Jobs and Data Quality Are On a Collision Course - Part 1 - The Problem
- Incremental Jobs and Data Quality Are On a Collision Course - Part 2 - The Way Forward
- On writing and getting from zero to done
- Learning first that you can learn
- Forget the table format war; it’s open vs closed that counts
- The teacher's nemesis
- The curse of Conway and the data space
- Change query support in Apache Paimon (0.8)
- Change query support in Apache Hudi (0.15)
- Table format interoperability, future or fantasy?
- Change query support in Delta Lake (3.2.0)
- Change query support in Apache Iceberg v2
- Table format comparisons - Change queries and CDC
- BYOC, not “the future of cloud services” but a pillar of an everywhere platform
- Constraints breed innovation and so does tenacity
- Table format comparisons - Streaming ingest of row-level operations
- Table format comparisons - Append-only tables and incremental reads
- Table format comparisons - How do the table formats represent the canonical set of files?
- Understanding Apache Iceberg’s Consistency Model Part 3
- Understanding Apache Iceberg’s Consistency Model Part 2
- Understanding Apache Iceberg's Consistency Model Part 1
- Understanding Apache Paimon's Consistency Model Part 1
- Understanding Apache Paimon's Consistency Model Part 2
- Understanding Apache Paimon's Consistency Model Part 3
- A Cost Analysis of Replication vs S3 Express One Zone in Transactional Data Systems
- Learning and reviewing system internals: tactics and psychology
- Hybrid Transactional/Analytical Storage
- Understanding Delta Lake's consistency model
- Understanding Apache Hudi's Consistency Model Part 1
- Understanding Apache Hudi's Consistency Model Part 2
- Understanding Apache Hudi's Consistency Model Part 3
- The Sisyphean struggle and the new era of data infrastructure
- Tableflow: the stream/table, Kafka/Iceberg duality
- The beauty of writing
- Scaling models and multi-tenant data systems - ASDS Chapter 6
- Serverless ClickHouse Cloud - ASDS Chapter 5 (part 1)
- Serverless ClickHouse Cloud - ASDS Chapter 5 (part 2)
2023 26
- S3 Express One Zone, not quite what I hoped for
- Serverless CockroachDB - ASDS Chapter 4 (part 1)
- Serverless CockroachDB - ASDS Chapter 4 (part 2)
- Serverless CockroachDB - ASDS Chapter 4 (part 3)
- Neon - Serverless PostgreSQL - ASDS Chapter 3
- Amazon DynamoDB - ASDS Chapter 1
- Kora - Serverless Kafka - ASDS Chapter 2
- The Architecture of Serverless Data Systems
- The importance of liveness properties (with TLA+ Part 1)
- The importance of liveness properties (with TLA+ Part 2)
- A primer on formal verification and TLA+
- The advantages of queues on logs
- On the future of cloud services and BYOC
- Kafka KIP-966 - Fixing the Last Replica Standing issue
- Kafka vs Redpanda Performance - Part 1 - 4 vs 50 producers
- Kafka vs Redpanda Performance - Part 2 - Long running tests
- Kafka vs Redpanda Performance - Part 3 - Hitting the retention limit
- Kafka vs Redpanda Performance - Part 4 - Impact of record keys
- Kafka vs Redpanda Performance - Part 5 - Reaching the limits of the NVMe drive
- Kafka vs Redpanda Performance - Part 6 - Draining backlogs
- Kafka vs Redpanda Performance - Do the claims add up?
- Is sequential IO dead in the era of the NVMe drive?
- Why Apache Kafka doesn't need fsync to be safe
- Paper: VR Revisited - Checkpoint-Based Replica Recovery (part 6)
- Paper: VR Revisited - Log-Based Replica Recovery (part 5)
- Paper: VR Revisited - Application state and commit-number monotonicity (part 4)
2022 7
- Paper: VR Revisited - State Transfer (part 3)
- Windows shortcut to invert colours that works
- Paper: VR Revisited - View changes - Answers (part 2)
- Paper: VR Revisited - An analysis with TLA+
- Paper: VR Revisited - View changes - Questions (part 1)
- Applying Flexible Paxos to Raft
- Write for others but mostly for yourself
2021 5
2020 2
2019 6
- A Look at Multi-Topic Subscriptions with Apache Pulsar
- Building A "Simple" Distributed System - It's the Logs Stupid
- Building A "Simple" Distributed System - The Implementation
- Building A "Simple" Distributed System - Formal Verification
- Building A "Simple" Distributed System - The Protocol
- Building a "Simple" Distributed System - The What
2018 25
- Quorum Queues - Making RabbitMQ More Competitive in Reliable Messaging
- Why I Am Not a Fan of the RabbitMQ Sharding Plugin
- Testing Producer Deduplication in Apache Kafka and Apache Pulsar
- How to (not) Lose Messages on an Apache Pulsar Cluster
- Understanding How Apache Pulsar Works
- How to Lose Messages on a Kafka Cluster - Part 2
- How to Lose Messages on a Kafka Cluster - Part 1
- How to Lose Messages on a RabbitMQ Cluster
- RabbitMQ vs Kafka Part 6 - Fault Tolerance and High Availability with Kafka
- RabbitMQ vs Kafka Part 5 - Fault Tolerance and High Availability with RabbitMQ Clustering
- AWS Security - Securing Your Use of the AWS CLI and Automation Tools
- RabbitMQ Work Queues: Avoiding Data Inconsistency with Rebalanser
- Creating Consumer Groups in RabbitMQ with Rebalanser - Part 1
- Docker, .NET Core and Redshift Drivers
- Event-Driven Architectures - Queue vs Log - A Case Study
- Event-Driven Architectures - The Queue vs The Log
- SQL Server CDC to Redshift Pipeline
- Processing Pipelines Series - Reactive Extensions (Rx.NET)
- Processing Pipelines Series - TPL Dataflow - Alternate Scenario
- Processing Pipelines Series - TPL Dataflow
- Processing Pipelines Series - Concepts
- AgileTM vs Real Agility - The Constant Rush
- AgileTM vs Real Agility - Truly Self-Organizing Teams
- AgileTM vs Real Agility - The Fight Is On
- Don't Believe The Hype
2017 20
- RabbitMQ vs Kafka Part 4 - Message Delivery Semantics and Guarantees
- RabbitMQ vs Kafka Series Introduction
- RabbitMQ vs Kafka Part 1 - Two Different Takes on Messaging
- RabbitMQ vs Kafka Part 2 - RabbitMQ Messaging Patterns
- RabbitMQ vs Kafka Part 3 - Kafka Messaging Patterns
- You don't need Scrum, you need Agility
- Kathryn McConkey - The Best Osteopath in Barcelona
- How to Make Your Messaging System Reliable and Keep Your Support Engineers Happy
- DSL Parser - Sample Code
- RabbitMq Delayed Retry Approaches (That Work)
- Reliability - Custom Retries - NServiceBus with RabbitMq Part 6
- Reliability - Default Retries - NServiceBus with RabbitMq Part 5
- Custom Topology - NServiceBus with RabbitMq Part 4
- Custom Direct Topology - NServiceBus with RabbitMq Part 3
- Default Topologies - NServiceBus with RabbitMq Part 1
- Default Topologies - NServiceBus with RabbitMq Part 2
- How to Deal with Unroutable Messages - RabbitMq Publishing Part 3
- Types of Publishing Failures - RabbitMq Publishing Part 1
- Sending Messages in Bulk and Tracking Delivery Status - RabbitMq Publishing Part 2
- Have you got chronic eye pain like me?
2016 27
- new SqlConnection - The requested Performance Counter is not a custom counter
- Building Synkronizr - A SQL Server Data Synchronizer Tool - Part 1
- Generating SQL from a Data Structure
- How to Kill a Keep Alive with a Weak Reference (C#)
- How Row Locking Makes Taskling Concurrency Controls Possible
- Announcing Taskling.NET, a C# Batch Job API
- Too Busy to Create Your Own Visualizations? Just Leverage the Neo4J Console
- Why You Should Understand Databases
- Exploring the use of Hash Trees for Data Synchronization - Part 1
- 5 Tricks For People Who Are Hyper Sensitive to Computer Screens
- Optimizing Regex performance with RegexOptions.RightToLeft
- A More Efficient Regex Tokenizer
- Implementing a DSL Parser
- How to Create a Query Language DSL with C#
- Creating a Simple Tokenizer (Lexer) in C#
- Understanding Grammars
- Detective Optimizers
- The Freedom Quadrant
- Logging Query Language (LQL) – a DSL for Log Analytics
- Stop time wasters and protect your knowledge sharing culture
- Being Open, Sharing Your Knowledge
- Code Analysis Rules and the Click Through Culture
- Code analysis rules versus training and coaching
- Make mini technical leads
- Breaking your own code and designs
- "We"
- Bitching will erode your team