Technical Values & Approach


Project goal:  Deliver v3 reports to users of v2 / eLMIS in Tanzania quickly - without a "full" upgrade.


Values

  • Pipelines allow us to break the problem down into structured independent data flows.
  • Everything is repeatable
    • Infrastructure as Code
    • (Re-)Running Pipelines
    • Experimentation
  • Nothing is manual, nothing is a one-off  - Automate
    • From environment setup to deployment, we put everything we can in code.
    • We never "just do a one-time tweak to the database/API/app/etc"
    • Backups
  • Resilient
    • Not a "big bang" migration, it will need to function continuously for weeks, months, perhaps even a year or longer.
    • During lifetime eLMIS and OpenLMIS v3 will have releases, data models will change without notice.
    • Source and destination software releases should slow new data from flowing, however both systems should stay available.
  • Data is usable in near-real time, a user should expect their data once entered to be available in seconds to minutes, not tens of minutes, hours or days.
  • Source system should be unaware and unaffected
    • We must demonstrate that eLMIS availability and performance can't be noticeably effected.
    • We must convince eLMIS developers that they do not need to coordinate releases with us, merely notify us of what's changing and by when.


Approach

Tech Stack:  Tech Stack

  • Deployed via Terraform, Ansible and Docker.
    • Terrraform & Ansible to provision environments.
    • Ansible to manage deployed application.
    • Docker as deployment unit and runtime.
  • Streaming architecture centered around Kafka
    • Decouple source and destination systems.
    • Native support for pipelines.
    • Kafka is one of the top leading technologies - built in support for high-performance, repeatable pipelines, and resilient log-architecture.
  • Change Data Capture using Debezium
    • Debezium works off the same internal PostgreSQL mechanism as replication - eLMIS database should be unaware and unaffected by it's presence.
    • Change Data Capture allows us to capture changes made directly to a database as they're made
    • We have direct access to the source data & it's schema, including changes to either.
    • Resilient against network outages - if the network is down, then Debezium simply will queue until it's restored.
  • Monitoring using Prometheus and Grafana
  • Control using ???
    • Simple (e.g. REST) interface for starting/stopping pipeline
    • Clear a pipeline's destination, and re-run pipeline (e.g. clear a table in v3, re-run the pipeline with a new transformation phase).
  • Simple Transformations using Nifi (or perhaps Java / Python)
    • Simple transformations may be chained together as needed, and are more testable.
    • Nifi is provisional:
      • Nifi is a tool we've been learning
      • Nifi Processors are a known commodity for building transformation stages
      • Nifi has been one of the more difficult tools to use, and it's more suited for building entire pipelines that are run one-off, rather than simple transformations.
      • We don't have a good method for testing Nifi - individual processors.
  • Schema Registry (optional)
    • Reduces size of messages in Kafka for database changes, improving performance.
    • Optional as it's mostly a performance enhancement.

OpenLMIS: the global initiative for powerful LMIS software