architecture · Jun 2025 – Present

Event-Driven Systems for High-Volume Billing & EV Telematics

Built event-driven distributed systems on AWS + Kafka + Cassandra for solar billing, TOU optimization, and EV telematics, and led the Cassandra driver migration off the deprecated Astyanax client.

Role
Backend service design, event pipelines, and the Cassandra driver migration
Team
Backend engineering
Scope
High-volume customer and device data across solar billing and EV telematics workflows at Bidgely
Level
Software Engineer

Cassandra client library

Astyanax (deprecated)DataStax Java Driver

Method: Migrated the Cassandra data-access layer across backend services off the deprecated Astyanax client to the supported DataStax Java Driver.
Window: during tenure

Data-access maintainability & reliability

legacy unmaintained clientsupported driver

Method: Qualitative outcome of the driver migration: improved maintainability, query reliability, and long-term platform stability.
Window: post-migration

Context

At Bidgely I work on the backend behind solar billing, time-of-use optimization, and EV telematics. These workflows generate large, bursty volumes of customer and device data — exactly the kind of workload that punishes tightly-coupled synchronous services.

Why event-driven

If services call each other synchronously, a slow or failing downstream pushes back-pressure all the way to ingestion, and a traffic burst has nowhere to go but the floor. Modeling the data as events on EventBridge, SQS, and Kafka decouples producers from consumers: bursts buffer in durable storage, consumers scale on their own, and a transient downstream failure becomes a retry instead of a cascade. Because that delivery is at-least-once, the consumers are built to be idempotent — processing the same event twice has the same effect as once, which is non-negotiable for anything touching billing. The cost is eventual consistency and harder end-to-end tracing — a trade worth making for a high-volume, bursty workload where reliability is the point.

The Cassandra driver migration

The services talked to Cassandra through Astyanax — a client that's deprecated and no longer maintained. Every month on it accrued risk: no upstream fixes, harder onboarding, growing distance from current Cassandra. I led the migration to the supported DataStax Java Driver.

The subtle part of a client swap isn't the API surface; it's the defaults. Consistency levels, retry policies, and timeouts differ between clients, and a silent change in any of them changes how your queries behave under failure. The migration was careful precisely because those defaults are part of the contract — I verified read/write behavior matched the old client before cutting services over.

Outcomes

High-volume billing and telematics data flows through resilient event-driven pipelines, and the data-access layer now runs on the supported DataStax driver — better maintainability, better query reliability, and less standing platform risk.

Decision Records

Where I Got It Wrong

Failure 1

During the driver migration, default consistency-level and retry-policy differences between Astyanax and the DataStax driver meant query behavior could change subtly under the services if taken at face value

Cost: Extra verification work to confirm read/write behavior matched the old client before cutting services over

Lesson: When swapping a database client, treat the default consistency, retry, and timeout settings as part of the contract — they differ between clients, and a silent change in them is exactly the kind of bug that only shows up under failure

Long-Term Impact

Event-driven pipelines and the supported Cassandra driver are foundations the team builds new billing and telematics workflows on.