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
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
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.