<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Vivian Neilley on Medium]]></title>
        <description><![CDATA[Stories by Vivian Neilley on Medium]]></description>
        <link>https://medium.com/@vneilley?source=rss-a393b3043091------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*IH4baU4KIiEZq9hSC7kHXA.jpeg</url>
            <title>Stories by Vivian Neilley on Medium</title>
            <link>https://medium.com/@vneilley?source=rss-a393b3043091------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 10 Nov 2026 05:40:06 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@vneilley/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Most FHIR Servers are Unusable in Production]]></title>
            <link>https://vneilley.medium.com/most-fhir-servers-are-unusable-in-production-8833cb1480b1?source=rss-a393b3043091------2</link>
            <guid isPermaLink="false">https://medium.com/p/8833cb1480b1</guid>
            <category><![CDATA[hl7]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[healthcare]]></category>
            <category><![CDATA[fhir]]></category>
            <category><![CDATA[cloud]]></category>
            <dc:creator><![CDATA[Vivian Neilley]]></dc:creator>
            <pubDate>Wed, 03 Nov 2021 17:41:43 GMT</pubDate>
            <atom:updated>2023-12-27T15:15:29.389Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wXt41idVrVzhr7vfnA7Ekw.png" /></figure><h4>FHIR Proof: Call to Action for FHIR Solutions to Prove their Usability</h4><p>Here is the ammo to ask the important questions regarding your FHIR solution.</p><p><strong>An in depth analysis of common FHIR offerings and their performance against real-world scenarios — along with a Call to Action for better product transparency</strong></p><p>Disclaimer: I am employed at Google Cloud as a Solution Architect.</p><p>**This story has been edited as of January 29th, 2022 to include <a href="https://www.smilecdr.com/benchmarking-smile-cdr">SMILE CDR’s Benchmarking</a> the organization published after my call to action. And while I disagree about their “numbers often don’t even matter” bit, since we are talking about patients here — not cars and phones — I am still delighted they published despite the hesitations. I wrote this article as a way to make it clear; we cannot operate on just reputations, as some of the largest, most trusted organizations are failing to meet expectations. So in the name of transparency, I want to thank the entire SMILE team and what an incredible reminder we can push ourselves forward as an industry, together. Next up, crucible battles?</p><p>After the recent publication of Google Cloud’s <a href="https://www.onixnet.com/gcp-healthcare-whitepaper">Healthcare API Benchmarking White Paper</a> — I did some digging into what other benchmarking exists for FHIR servers. Turns out, this was a harder task than expected. My findings uncovered dismal scale and performance numbers, varying widely across vendors. I also found an overall lack of transparency and documentation for products making me wonder… Enterprises make decisions based on scale, performance, and cost — so where are those numbers for FHIR offerings? How do decision makers know what questions to ask or what expectations to set for their solutions, if there is no documentation to guide them?</p><p>So here is my attempt to give enterprises a guide to what questions to ask, what expectations to set, and what your organization may need for FHIR solutions.</p><p><strong>My Research and Call to Action: </strong>This blog is using public information — most of it being from product documentation or anecdotal, either from users or threads for various products. This means, this is in no way a complete analysis — in fact, I request anyone who can provide public documentation that materially contributes to this analysis to please email it to girlonfhir AT google.com and I will happily update this blog.</p><p>FHIR will only be the interoperability standard if it can be used in real-world use cases. Every database row is a life, every extra second could make a difference for someone. At the end of the day… this is why you should care about scale and performance. This isn’t just an industry buzzword, these are real lives and patient outcomes.</p><p>So here are some real world scenarios for perspective…</p><h3>Why Care about Scale?</h3><p><a href="https://vneilley.medium.com/amazon-healthlake-does-generally-available-mean-enterprise-ready-e815983a8a5">In a previous blog</a> I discussed the issues with having multiple FHIR servers.</p><p>There are multiple complications with trying to use multiple databases, FHIR servers, and/or federating the servers. The heart of the issue is with referential integrity, synchronization/consistency, and most importantly — authentication, user access, and security. Thus, an organization can only (reasonably) use a single FHIR offering across their population.</p><p>If an organization sees ten million patients a year, they would create around five billion FHIR resources a year (<a href="https://docs.aws.amazon.com/healthlake/latest/devguide/quotas.html">1 patient = ~500 FHIR resources</a>). With data retention around three years, the organization will need storage that can support fifteen billion resources, or ~30 TB of data.</p><p><strong>A FHIR server should be able to scale to terabytes of data and store billions of resources.</strong></p><h3>Why Care about Performance?</h3><p><a href="https://vneilley.medium.com/amazon-healthlake-does-generally-available-mean-enterprise-ready-e815983a8a5">In the same blog</a> I set up a real-life scenario of streaming healthcare data throughput from electronic health records (EHR) (HL7v2 feeds).</p><p>If a large system is sending <a href="https://blog.interfaceware.com/hl7-message-throughput-is-a-critical-metric-for-interface-engines/">around 8 million HL7v2 messages a day</a>, there would be ~500,000 messages during a peak hour. There are around 15 FHIR resources created per message, this means the organization is ingesting ~2,000 FHIR resources a second streaming in from their EHR.*</p><p>*This is the architecture Google’s <a href="https://cloud.google.com/healthcare">Healthcare Data Engine</a> is solving for</p><p><strong>A FHIR server should be able to ingest/create thousands of resources per second.</strong></p><h3>The Options</h3><h4><strong>Scale — storage size supported by the service</strong></h4><p>For scale — I used what the largest implementation of the product had been documented as. If that information was unavailable, I used limits stated on product pages.</p><h4><strong>Performance — speed of the service</strong></h4><p>For performance — there are many many API operations that could be tested for various performance needs. I focused on the creation or ingestion of FHIR data — by resources, FHIR bundles, or in bulk — and the throughput of those options.</p><p>Note: I believe search may be the most indicative measure of performance at scale, however, due to the unavailability of documentation from other vendors on this benchmarking, I was unable to provide comparisons at this time.</p><h4><strong>Type of Server</strong></h4><p>There are two very different classes of products — unmanaged versus managed services. You can do some googling on the difference between the options, however, from a scale and performance point of view — unmanaged is directly related to the amount of infrastructure provisioned, versus managed is heavily reliant on the service provider.</p><h3>Managed Services</h3><h3>Google Cloud</h3><h4><strong>Scale</strong></h4><p>As stated in the <a href="https://www.onixnet.com/gcp-healthcare-whitepaper">white paper</a> — Google was tested using a single<strong> </strong>FHIR datastore with 50 million patient records (26 billion resources) which equals about 60 TB of data.</p><h4><strong>Performance</strong></h4><p>Bulk Import — Ingested 10,038 resources a second (95 percentile)</p><p>Execute Bundle — Response time at 18 milliseconds per resource, or ~55 resources/second* (95%) from a single client thread</p><p>*Can be parallelized to achieve increased resource per second execution</p><h4><strong>Overall</strong></h4><p>Meets enterprise requirements for size and throughput.</p><h3>Azure</h3><h4><strong>Scale</strong></h4><p>The documentation states <a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits">the maximum available RUs for their FHIR API</a> is 1 million, allowing for about 25 TB of data assuming 40 RUs per GB.</p><h4><strong>Performance</strong></h4><p>Bulk Import — not supported (user has to use the <a href="https://github.com/hansenms/FhirLoader">FHIR loader</a>)</p><p>*FHIR Loader <a href="https://stackoverflow.com/questions/61483216/sending-bulk-data-to-azure-fhir-server">— 500 resources a second at default 10,000 RU/s</a></p><ul><li>This could be improved by adding more RU/s to the FHIR server, thus cost, and it is unclear what performance improvements would look like</li><li>Any parallel operations being done would bottleneck this</li></ul><p>Execute Bundle — Users have documented around <a href="https://docs.microsoft.com/en-us/answers/questions/158205/how-do-we-bulk-uploadingest-resources-into-azure-a.html">120k resources per hour</a>, or ~33 resources/second</p><p>*Note: The FHIR loader parallelizes execute bundle calls to “bulk ingest” data. This means instead of a single, long running operation — it is many operations all at once, creating additional cost and throttling the API. (For comparison, Google’s Bulk FHIR Ingest is a free long running operation and 20x faster at default configuration).</p><h4><strong>Overall</strong></h4><p>Azure’s FHIR Healthcare API may meet enterprise requirements for size, however, will likely be throttled with streaming or API performance needs. An interesting note for Azure’s offering is the storage and API operations are all dependent on resource units. This means if the resource units are being utilized for say an ingest operation, users must provision additional resources (read: costly) to support their other use cases like read, search, and storage.</p><h3>AWS</h3><p><a href="https://vneilley.medium.com/amazon-healthlake-does-generally-available-mean-enterprise-ready-e815983a8a5">Previous Blog Here.</a></p><h4><strong>Scale</strong></h4><p>The documentation states the maximum is <a href="https://docs.aws.amazon.com/healthlake/latest/devguide/limits.html">500,000 resources per database</a>. Based on their documentation of 2 KB per resource, AWS can support 0.001 TBs.</p><h4><strong>Performance</strong></h4><p>Unclear product documentation and little documented enterprise usage for there to be reliable threads/community discussions about.</p><p>That being said, I do think import performance is irrelevant when the data limits are so low.</p><h4><strong>Overall</strong></h4><p>It is unclear if AWS HealthLake could meet either enterprise scale or performance needs.</p><h3>Unmanaged Services</h3><p>This option is a traditional way of viewing infrastructure. It requires the customer to provision everything themselves. Most of the information on why to choose managed vs unmanaged is core to Cloud’s positioning and can be found on any number of marketing documentation.</p><p>For FHIR specifically there is a lot of work that needs to be done from the server side to horizontally scale the server and database — however, the most difficult task can be creating, managing and optimizing indexes. An enterprise FHIR server that is unmanaged likely requires an additional team of database administrators and infrastructure experts to ensure the solution can meet scale and uptime requirements.</p><h4>Performance Implications</h4><p>With unmanaged services, scale and performance are directly related to the database and infrastructure being used. If a SQL server is being used, it will likely not scale to the same size as a NoSQL or GraphQL database. Similarly, performance is going to be correlated with how much infrastructure the server is provisioned on.</p><p>For some perspective — IBM recently wrote <a href="https://www.ibm.com/blogs/watson-health/ibm-fhir-server-vs-hapi-jpa/">a blog</a> on their performance testing (way to go, IBM!)</p><h3><strong>HAPI*</strong></h3><p>I do not discuss the scale of HAPI in this blog, as IBM out performed HAPI in all three of the performance tests that were conducted.</p><ul><li>HAPI is the backbone of SmileCDR.</li></ul><h3>SmileCDR</h3><p>SmileCDR has since published their performance testing and I have included it as an update to this post (1/29/2022). Thank you SMILE CDR for heeding my call, even if you roasted benchmarking in the process :)! I have moved them down to the unmanaged section as well.</p><h4>Scale</h4><p>This is the second largest scale test I have seen be published to date (see above). SMILE was tested with 1 million patient records (1 billion resources) which equals about 2.2 TB of FHIR data. I suspect this number was done for time and simplicity of the test, as a user could configure additional infrastructure and the author makes it clear it can be scaled to greater loads.</p><p>The maximum capacity of the infrastructure SMILE chose (Amazon’s Aurora PostgreSQL) is <a href="https://aws.amazon.com/about-aws/whats-new/2020/09/amazon-aurora-increases-maximum-storage-size-128tb/">128 TB of data.</a></p><p>** One thing I would love to see from SMILE is how indexes affect the storage numbers. It mentions they turn OFF some default search parameters for customers, as they increase storage space. This is a major point for managed services that can provide full-functionality out of the box without reducing performance or increasing cost and storage.</p><h4>Performance</h4><p>Bulk Import — after some digging, it appears that SMILE does not supports bulk import of raw FHIR data. SMILE does support <a href="https://smilecdr.com/docs/json_admin_endpoints/bulk_import_endpoint.html">bulk import</a> of CSVs to be transformed to FHIR, <a href="https://smilecdr.com/docs/bulk/etl_import_module.html#initiating-etl-jobs">as documented here</a>.</p><p>Due to this, similar to Azure’s method, SMILE suggests parallelizing the bulk load, in a bundle format.</p><p>Execute Bundle — the import performed by execute bundle is impressive at 11,716 resource per second — however this is over 100 upload threads. In order to compare it to other numbers provided above, that averages to about 117 resources per second per thread. That is still the best that has been calculated for execute bundle in this blog, however, per thread is still significantly slower than what one can achieve with a bulk import functionality.</p><h4>Cost</h4><p>It wouldn’t be a true enterprise comparison without a cost comparison!</p><p>Based on the tests run, SMILE used a 4–6 EC2 instances throughout the test. That has a runtime cost of around <a href="https://calculator.aws/#/estimate?id=4c1185ac61d58638dfd863ac34328cb23083a513">$484/month</a> at their maximum use tested.</p><p>Amazon’s Runtime: $194.40 ($0.27/hour), Azure’s Runtime: $292.00 ($0.40/hour), Google’s: Free</p><p>The storage and use of database costs are on Amazon’s Aurora, and with 2 TB of data and 64 ACUs (their tested max) the storage costs is around <a href="https://calculator.aws/#/estimate?id=b7e76648bfaa517b2f937bc67d39408c498efc38">$3,000/month</a>. This ACUs model is similar to Azure’s RU/s model where ACUs need to be scaled up by operations.</p><p>This is one drawback of not supporting bulk import, where both AWS’ HealthLake and GCP’s FHIR APIs support free import.</p><p>All of this is with an asterisk that I do not know the cost of licensing for SMILE and those should be considered as well when doing a true analysis.</p><h4>Overall</h4><p>One sticking point, when compared to the other offerings above, is the need to set up infrastructure opposed to simply “click to deploy” models that the Cloud vendors offer. The level of fine tuning someone is willing to do impacts the usability, for example, infrastructure was reconfigured and scaled up/down manually through out the scale test. This can be a positive and negative as I elaborated above, however it does make it more difficult to directly compare to other offerings that do not need infrastructure configuration.</p><h3><strong>IBM</strong></h3><h4>Scale</h4><p>The scale of open sourced, unmanaged servers will be tied to what database they are being implemented on. The scale of that database will be the limiting factor to size. The blog does not talk about the size of their implementation tests, however, the authors used PostgreSQL databases. Limits to PostgreSQL databases are not documented, however, in order to meet tens of terabytes of scale users would likely need to shard the system into many servers.</p><h4><strong>Performance</strong></h4><p>Performance is tied to how much infrastructure is provisioned. The largest tested infrastructure in the blog was 100-threads on a Kubernetes server, where IBM performed ingest at 750 resources/second.</p><h4><strong>Overall</strong></h4><p>An enterprise could likely provision enough infrastructure to meet their size and performance needs, however, it would be difficult to manage and require constant tuning and upkeep.</p><h4><strong>Honorable Mentions</strong></h4><p>IBM’s search functionalities were impressive in this exercise, however, even though latency was performant (quick to return) — the authors did not test the scale of many operations at once. With a single server being used as an operational store it should be assumed that it will need to support many requests hitting the API at once and the solution needs to be tested for such.</p><h3>Limits</h3><p>This blog covers latency at an extremely high level, however, I cannot account for the networking specifications such as on-premise versus Cloud — and the many networking options enterprise Clouds provide. These limitations should be considered when making a decision regarding FHIR solutions.</p><p>This blog also does not get into the specifics of search performance. Search is one of the most important functionalities for a FHIR server to support at scale and users should be requiring search benchmarking from solutions. Specifically, there are documented issues with things like pagination tokens in search (such as with HAPI: <a href="https://github.com/hapifhir/hapi-fhir/issues/536">https://github.com/hapifhir/hapi-fhir/issues/536</a>) that need to be considered when making a decision for your organization.</p><h3>Conclusion</h3><p><strong>Takeaways:</strong></p><ul><li>Almost all servers reviewed — except Google Cloud’s — could likely not handle streaming EHR data into their servers</li><li>Azure should consider supporting bulk FHIR ingest as they are currently operating on an open source functionality that bottlenecks this workflow (and is more $)</li><li><strong>— Google is 20x faster than Azure at default for ingest</strong></li><li>AWS would need to clarify their scale capabilities before performance testing can be considered</li><li>Where is Smile CDR and their documentation?</li><li>Comparing open source/unmanaged systems to managed systems in this context is extremely difficult as they are apples to oranges</li><li>— I applaud IBM for doing benchmarking on their system and releasing the results</li></ul><p>Ideally, this blog brings to light the need for clarity, documentation, and performance testing. I hope this encourages organizations to be transparent about their limitations, and thus, the use cases their products are capable of supporting.</p><p>The storage and performance implications are the differences in people’s lives. I hope this calls out the questions and expectations decision makers need to be asking of their FHIR solutions.</p><h3>Author’s Notes</h3><p>Let me be real for a second — and transparent about my thoughts that I cannot validate with data. FHIR is meant to be an interoperability standard. What this means, beyond just storing and surfacing data, is the connection layer. FHIR is building an ecosystem — it wants to be an ecosystem for connecting data to models, applications, and ultimately patients.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wXt41idVrVzhr7vfnA7Ekw.png" /></figure><p>What this really means is the performance requirements I can calculate today (thousands API hits per second) will be exponentially raised going forward. If FHIR becomes what I hope it does, we will need scale and performance far beyond what is outlined here.</p><p>Enterprises should be prepared for that future.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8833cb1480b1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Amazon HealthLake — Does Generally Available mean Enterprise Ready?]]></title>
            <link>https://vneilley.medium.com/amazon-healthlake-does-generally-available-mean-enterprise-ready-e815983a8a5?source=rss-a393b3043091------2</link>
            <guid isPermaLink="false">https://medium.com/p/e815983a8a5</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[cloud]]></category>
            <category><![CDATA[fhir]]></category>
            <category><![CDATA[healthcare]]></category>
            <category><![CDATA[fhir-server]]></category>
            <dc:creator><![CDATA[Vivian Neilley]]></dc:creator>
            <pubDate>Tue, 20 Jul 2021 14:53:46 GMT</pubDate>
            <atom:updated>2021-07-20T14:53:46.379Z</atom:updated>
            <content:encoded><![CDATA[<h3>Amazon HealthLake — Does Generally Available mean Enterprise Ready?</h3><h3>Overview</h3><p>I previously wrote a comparison about<a href="https://cloud.google.com/healthcare"> Google Cloud’s Healthcare API</a> offering and <a href="https://aws.amazon.com/healthlake/">AWS’s HealthLake</a> offering <a href="https://vneilley.medium.com/are-all-fhir-apis-the-same-v2-e8d8359e1412">here</a>. When I did the initial comparison AWS had not released their product for general availability so I did not include the documented limitations for the product.<a href="https://press.aboutamazon.com/news-releases/news-release-details/aws-announces-general-availability-amazon-healthlake"> Now that it has been GA-ed</a>, I wanted to add onto <a href="https://vneilley.medium.com/are-all-fhir-apis-the-same-v2-e8d8359e1412">the previous publication</a> with usability and scale considerations with AWS HealthLake. <a href="https://aws.amazon.com/healthlake/">The homepage claims</a> to support use cases such as, “manage population health, improve care quality, optimize hospital efficiency.” Upon further evaluation these use cases are not feasible using the out of the box product, as documented in this post.</p><p><strong>NOTE: </strong>Most of the issues discussed in this blog are based on AWS’ <a href="https://docs.aws.amazon.com/healthlake/latest/devguide/limits.html">limitations documentation</a>. AWS states that users<a href="https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html"> “can request increases for some quotas, and other quotas cannot be increased.”</a> I attempted to understand which of the HealthLake quotas can be raised by viewing the<a href="https://console.aws.amazon.com/servicequotas/home"> Service Quotas console</a>, however, none of the HealthLake quotas are listed. I then <a href="https://console.aws.amazon.com/support/home?#/">attempted to file a support ticket</a>, however, HealthLake is not a listed supported product within the service limit dashboard (screenshot below). As far as I can tell, users cannot currently request quota increases to HealthLake. I could not determine what quotas (if any) are able to be raised nor how users could increase quota if available.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*NVW20qfTzVBnGn-m" /><figcaption>Screenshot from my AWS Support Center Console</figcaption></figure><h3><strong>Real-World Use Cases with AWS HealthLake</strong></h3><p>In order to understand the scale issues with HealthLake, let’s start by creating an example health system to base assumptions off of. A typical clinical organization has at least one electronic health record (EHR) system, or often times many, EHRs through out their organization. A common use case systems are implementing is to leverage real-time EHR data to feed machine learning models — shown below.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zk549GrChhG49A8T" /><figcaption>Common Real-Time Clinical Architecture</figcaption></figure><p>In total these EHRs can send a few million HL7v2 messages a day. The average number of HL7v2 messages per day is up for debate — OrionHealth quotes<a href="https://orionhealth.com/us/knowledge-hub/webinars/enterprise-integration-engine-for-large-scale-interoperability/"> 50 million per day here</a> and InterSystems<a href="https://community.intersystems.com/post/intersystems-iris-health-20201-hl7-benchmark"> benchmarks at over a billion per day here</a>. In my experience both of those rates are higher than what we see in the wild. Something more practical, for example, is the scale iNTERFACEWARE tests that<a href="https://blog.interfaceware.com/hl7-message-throughput-is-a-critical-metric-for-interface-engines/"> “closely mimic(s) real world situations” at around 8.3 million inbound messages a day.</a></p><p>Now, let’s assume you’re a small system — your EHR may only produce ~1 million HL7 messages a day (~10/sec). This is a <strong>low</strong> estimate as it assumes the same rate throughout the day instead of accounting for the ebbs and flows of patient care.</p><p>Based on the above, AWS must support ingestion of <strong>at least </strong>10 HL7v2 messages per second-for a small hospital system to stream their patient data to HealthLake. Using the defined architecture (above) for streaming EHR data — we need to convert the HL7v2 messages to FHIR resources. A single patient admit message (ADT01) creates<a href="https://github.com/GoogleCloudPlatform/healthcare-data-harmonization/blob/master/mapping_configs/hl7v2_fhir_r4/projector_library/messages.wstl"> 15 FHIR resources</a> based on the open source standards.</p><p><strong>This means a small hospital system would create around 150 FHIR resources per second. This is well beyond the AWS HealthLake’s documented </strong><a href="https://docs.aws.amazon.com/healthlake/latest/devguide/limits.html"><strong>limitations for ingestion</strong></a><strong>.</strong></p><p>HealthLake’s ResourceCreate operation scales to support <a href="https://docs.aws.amazon.com/healthlake/latest/devguide/limits.html">20 resources/sec</a>. Our fictional organization would have to split the streaming pipeline into 8 different FHIR stores to ingest their data — with absolutely no read or deletes allowed.</p><p>If our organization chose to use the update operation instead of create, HealthLake’s ResourceUpdate operation scales to support <a href="https://docs.aws.amazon.com/healthlake/latest/devguide/limits.html">100 transactions/sec</a>. This would require us to have at least 2 FHIR stores to support our streaming data use case.</p><p>You might ask, so what? The issue with multiple FHIR stores is that there is no simple way to aggregate FHIR data from multiple stores. Read: <strong>Users cannot easily aggregate patient data if it is stored in multiple FHIR stores.</strong> FHIR does not have specs for federated searches and it is difficult to create a single facade over multiple databases as highlighted <a href="https://t.co/KtFqeRiHVR?amp=1">in this FHIR DevDays talk.</a></p><p>TL;DR — there is <strong>no way for an organization to meaningfully use all of their streaming FHIR data in AWS HealthLake today.</strong></p><p>So instead, let’s suppose we are only batch loading our data. In <a href="https://synthea.mitre.org/about">Synthea</a>, a realistic synthetic FHIR generator, one patient record is ~546 FHIR resources. AWS’s HealthLake states to only support <a href="https://docs.aws.amazon.com/healthlake/latest/devguide/limits.html">500,000 FHIR resources per store</a>. <strong>This means each FHIR store only supports 915 patient records.</strong></p><p>Therefore, in order to do analytics or searches over more than 900 patients — a user must export the data (<a href="https://aws.amazon.com/healthlake/pricing/">for a fee</a>) and send it to a different AWS product. The only supported product integration today is for S3 storage (not an analytics product). <strong>Read: analytics requires custom code and pipelines.</strong></p><p>HealthLake does not support streaming export, and in fact, the documentation says,</p><blockquote>“Only one import or export job can run at time for an active Data Store.” — AWS HealthLake Developer Guide</blockquote><p>This means a user cannot do real-time analytics over a HealthLake Data Store. The export capabilities is bottlenecked by a single operation — and that single operation has <a href="https://docs.aws.amazon.com/healthlake/latest/devguide/limits.html">a limit of one per minute</a>.</p><p>Finally — assuming 915 patient records per store, and with a quota of ten stores per account, <strong>a single AWS account can only support storage for ~9,150 patients.</strong></p><p>A traditional health system that sees around one million patients a year would need a 100x the scale of AWS HealthLake to support their system for a single year.</p><p><strong>These product limitations inhibit the very use cases their documentation claims to support.</strong> The website <a href="https://aws.amazon.com/healthlake/">states HealthLake can</a>: “manage population health, improve care quality, and optimize hospital efficiency.” Let’s dig.</p><p>The first <a href="https://aws.amazon.com/blogs/machine-learning/population-health-applications-with-amazon-healthlake-part-1-analytics-and-monitoring-using-amazon-quicksight/">blog on population health</a> states AWS uses the <a href="https://mimic.physionet.org/">MIMIC-III</a> dataset that has over 40,000 patients. Upon further reading, the actual number of patients ingested into the AWS FHIR Data Store was 1,001 patients (screenshot below) — far less than MIMIC’s 40k patients.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*KXvbzTLwwYg9zKf3" /></figure><p>In AWS’ <a href="https://aws.amazon.com/blogs/machine-learning/building-predictive-disease-models-using-amazon-sagemaker-with-amazon-healthlake-normalized-data/">blog for improving quality care using machine learning</a>, the examples also were capped at 1,000 patients (“500 patients with a positive CHF diagnosis…500 patients who didn’t have a CHF diagnosis”).</p><h3>Summary</h3><p>I’m hoping AWS provides more support, documentation, or use cases that demonstrate their product in a real world scenario. Based on my research, the current state is not a feasible option for many enterprise customers today.</p><p>*This is not discussing the need for reads and searches — most business use cases in FHIR include high-transaction support — such as precision medicine, operational efficiencies, and SMART-on-FHIR applications. Read operations are also throttled to 20 resources per second, even less if users are also running create or delete operations on the store.</p><h3>Note from the Author</h3><p>While this is a review of the AWS limits with FHIR, it should not be lost on the reader that there is a bigger theme at play — FHIR at scale. Right now, the community has little solution for supporting use cases that require FHIR data that is stored in different databases. Until we can easily solve this by building a scalable facade or creating a federated search model, users must be considering the scale of their FHIR solution. I hope this article helps users begin to understand the consequences that can come from not appropriately scoping a solution prior to implementation. Just like we do with any other database and server on the market today, I propose we start bringing scalability into the FHIR conversation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*-PUm_u7KWF7JYuJ7nIXmlg.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e815983a8a5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Are all FHIR APIs the Same? v2]]></title>
            <link>https://vneilley.medium.com/are-all-fhir-apis-the-same-v2-e8d8359e1412?source=rss-a393b3043091------2</link>
            <guid isPermaLink="false">https://medium.com/p/e8d8359e1412</guid>
            <category><![CDATA[fhir]]></category>
            <category><![CDATA[healthcare]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[api]]></category>
            <category><![CDATA[google]]></category>
            <dc:creator><![CDATA[Vivian Neilley]]></dc:creator>
            <pubDate>Wed, 02 Jun 2021 20:58:49 GMT</pubDate>
            <atom:updated>2021-06-02T22:00:53.162Z</atom:updated>
            <content:encoded><![CDATA[<h3>An in depth analysis of AWS’ HealthLake versus Google Cloud’s Healthcare API for FHIR as of June 2021</h3><p>Disclaimer: I am employed at Google Cloud as a Solution Architect.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/425/1*WjuIrXZE8aSgSvkt_290ug.png" /></figure><h3>Introduction</h3><p>I am a FHIR advocate — and thus, am always interested in the next best addition to the FHIR family. Previously, I wrote a blog on the difference between Azure and Google’s FHIR APIs <a href="https://vneilley.medium.com/are-all-fhir-apis-the-same-48be75ac4ac5">here.</a> As a continuation of the managed API series, I decided to look into <a href="https://aws.amazon.com/healthlake/">AWS’ HealthLake.</a> AWS announced HealthLake at their Re:Invent conference earlier this year. Unfortunately, it is in preview, so I am unable to test out the product, thus, all of my research is based on their documentation and their conference presentations.</p><p>This is an analysis of <a href="https://aws.amazon.com/healthlake/">AWS’ HealthLake product</a> in comparison to <a href="https://cloud.google.com/healthcare/docs/concepts/fhir">Google Cloud’s FHIR</a> and healthcare services. As always, I attempt an unbiased review of both with documentation and resources to support. This reflects the state of both services as of June 2021.</p><h3>Infrastructure and Scalability</h3><h4>Google Cloud (<a href="https://vneilley.medium.com/are-all-fhir-apis-the-same-48be75ac4ac5">from previous blog</a>)</h4><p>The underlying infrastructure for the API is built on Spanner, the same technology that powers <a href="https://cloud.google.com/spanner/?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=na-US-all-en-dr-bkws-all-all-trial-e-dr-1009135&amp;utm_content=text-ad-none-any-DEV_c-CRE_178649616666-ADGP_Hybrid+%7C+AW+SEM+%7C+SKWS+%7C+US+%7C+en+%7C+Multi+~+Spanner-KWID_43700018041306779-kwd-100039195&amp;utm_term=KW_spanner-ST_spanner&amp;gclid=Cj0KCQjwgo_5BRDuARIsADDEntTO-hUnH8OFwkO_FECiJhs86qVVTaNFiaygwpOeUnsL_8-0c-WLc1EaAtZJEALw_wcB">Google Cloud Spanner</a>. Google Cloud Spanner is described as a “fully managed relational database with unlimited scale, strong consistency and up to 99.999% availability.” It is a first of its kind database, claiming to <a href="https://cloud.google.com/blog/products/gcp/inside-cloud-spanner-and-the-cap-theorem">break the CAP theorem</a>, having both analytics and transactional functionalities. Spanner ensures <a href="https://cloud.google.com/spanner/docs/true-time-external-consistency">“TrueTime” external consistency</a> which is the strongest form of consistency one can achieve for transactions in a distributed system. On top of the Spanner infrastructure, Google Cloud’s Healthcare API is tightly integrated with additional proprietary technologies such as indexing and queuing features, optimized for FHIR workloads, to achieve its performance and scalability.</p><h4>AWS</h4><p>Amazon does not have clear documentation on exactly how FHIR data is persisted. Based on their <a href="https://docs.aws.amazon.com/healthlake/latest/devguide/how-healthlake-works.html">FHIR search functionality documentation</a> AWS states data first is stored in Amazon DynamoDB for CRUD operations and then processed into an Amazon Elasticsearch Service cluster for search operations. It is unclear if that suggests the data is persisted in two separate products based on the users interaction with the product — or if it is removed from DynamoDB once the data has been processed. It is also unclear what the latency/performance implications are by having a data processing pipeline between the two products. In fact, the documentation alludes to some latency as it states the store has “eventual consistency” for searchability.</p><h4>Comparison</h4><p>Spanner and DynamoDB have plenty of comparisons done by third parties, so I will not cover the database differences in this article, rather, focus on the difference between the APIs provided by Google Cloud and AWS HealthLake to access the FHIR data. Both APIs leverage performant, high availability back-end systems for their FHIR data storage, yet neither API provides direct access to the underlying datastore.</p><h3>Architecture</h3><h4>Google Cloud</h4><p>Google Cloud FHIR service has tight integration with the other offerings in the Google Cloud product stack, as stated below.</p><p><strong>BigQuery Integration</strong></p><p>First and foremost, there is an out-of-the-box integration with Google’s Cloud data warehouse product, <a href="https://cloud.google.com/bigquery">BigQuery</a>. This means with one-click users can bulk <a href="https://cloud.google.com/healthcare/docs/how-tos/fhir-export-bigquery">export FHIR data to BigQuery</a>, or choose to stream data from the FHIR store to BigQuery real-time. This saves organizations from the hassle of creating and maintaining a custom pipeline between the products, as it is done automatically for users without any code. This also saves users from writing a DDL or maintaining the schema — as Google uses community best practices by leveraging the <a href="https://github.com/FHIR/sql-on-fhir">SQL on FHIR schema</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*qm1H8lIIj1GxwcqW" /><figcaption>Google’s Healthcare API Console View for Store-Wide Actions</figcaption></figure><p>BigQuery also is a main point of integration for Google Cloud’s ML suite, such as their recently announced <a href="https://cloud.google.com/vertex-ai">Vertex AI</a>. Once data is exported or streamed to BigQuery, users can utilize their data to train and deploy models, enrich with BigQuery’s <a href="https://cloud.google.com/bigquery/public-data">public datasets</a>, or integrate with any number of partners in the BigQuery ecosystem.</p><p><strong>Google Cloud Storage Integration</strong></p><p>A second out of the box integration option is with Google’s object storage product, <a href="https://cloud.google.com/storage">Google Cloud Storage</a>. With the same one-click method used for BigQuery, <a href="https://cloud.google.com/healthcare/docs/how-tos/fhir-import-export">users can import and export FHIR data to and from Google Cloud Storage</a>. This is useful for data interoperability and sharing use cases.</p><p><strong>Google Cloud Pub/Sub Integration</strong></p><p>Finally, Google’s Healthcare API has out of the box integration (again, one click, no code) with their <a href="https://cloud.google.com/pubsub/docs/overview">Pub/Sub product</a>. This is a <a href="https://cloud.google.com/healthcare/docs/concepts/pubsub">real-time notification service</a> for events that occur on the FHIR store. The notification — or message — is published when a resource is created, updated, or deleted from a FHIR store. This notification can be used to kick off any number of real-time workflows, such as triggering an action on an application or to use the new resource as an input for a ML model. Pub/Sub allows for integration with most of the Google Cloud’s data suite.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/736/0*MkWEpsIzeIkeYNIE" /><figcaption>Some of the product options for Google Cloud Pub/Sub integration</figcaption></figure><p><strong>Overall Architecture</strong></p><p>The overall architecture for Google Cloud’s Healthcare APIs is demonstrated in the image below. Note: there are capabilities shown that are out-of-scope for this article.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oKv132cByuAZ33DNhUG1RQ.png" /><figcaption>Common Interoperability Use Cases on Google Cloud</figcaption></figure><h4>AWS</h4><p>HealthLake’s main value add is their integration with <a href="https://aws.amazon.com/comprehend/medical/">Amazon Comprehend Medical</a>, a natural language processing service specific for medical use cases. AWS provides the seamless ability to search on text data that has been through Comprehend Medical and stored in the FHIR format. This is a value add for analyzing free text and clinical notes that may be difficult to abstract otherwise in combination with structured clinical data stored natively in the FHIR format.</p><p>Other than Comprehend Medical, the only other data integration Amazon HealthLake has with its product suite is through their object storage product, <a href="https://aws.amazon.com/s3/">Amazon S3</a>. Users can import and export data from S3 into Amazon HealthLake in batch/bulk only. The overall architecture for Amazon’s HealthLake is demonstrated in the image below. Note that the only way to utilize Amazon SageMaker, their ML tool suite, is by exporting to object storage, creating a custom pipeline, and pushing it to the rest of the architecture.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/0*3P0ds6XNqChcrX3N" /><figcaption>Common Architecture for Amazon HealthLake Use Case</figcaption></figure><h4>Comparison</h4><p>The main external data integration AWS offers is with their object storage product, S3, for batch import and export. This means Amazon only supports bulk/batch use cases and cannot be utilized for streaming use cases. Google offers the same functionality with their Google Cloud Storage integration, but also has additional integrations with their data warehouse and notification services. Fundamentally, if a user wanted to utilize the FHIR data outside of the CRUD and search operations provided by HealthLake, they would have to build custom pipelines to other products and build their own event management system. Google Cloud has removed the need for users to write or manage any integration code by providing UI-based product integrations and coupling with a comprehensive database notification system.</p><h3>Accessing the FHIR Data API Comparison</h3><p>FHIR Servers traditionally offer an API specification defined by the HL7 community on how to interact with the FHIR server. FHIR servers typically need to accommodate for enterprise functionality beyond the API methods defined by the standard FHIR specification, for example, import and export to other systems and a need for analytics on FHIR data. The ability to use SQL directly over FHIR is becoming increasingly popular in the community, as well as the need to visualize the data for dashboards or administrative tasks. FHIR data viewers have also risen in popularity to allow non-technical users access to the raw data without having to manually parse the JSON data to understand the resource. Currently, AWS only offers users to access data in the raw JSON, whether it be in a storage object or from an API return. Google’s suite also offers direct API access to FHIR content as well as integration to utilize the raw JSON as Google Cloud Storage objects. Google has two additional functionalities not supported by AWS’s HealthLake — direct access through a SQL database and a UI to view data. Google allows for structured SQL-querying and viewing of FHIR through BigQuery by a direct integration between the products. In addition, Google has also launched its own FHIR viewer. Google’s FHIR viewer allows users to access their resources through the Cloud Console — providing an easily-digestible way to view FHIR data for all users, regardless of skill set. It provides options for an overview display, a tree-structured visualization (shown below), and a direct view of the raw JSON object. Finally, the FHIR viewer allows users to navigate between referenced resources by simply clicking on the reference. FHIR accessibility is a clear area where Google has increased functionality and usability.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*VVxUuvI_dIRwq56U" /><figcaption>Google Cloud’s FHIR Viewer UI</figcaption></figure><h3>FHIR Version Support Comparison</h3><p>The following table lists the currently supported versions by each service.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ba5c81d6a875b7b71fd9b8047e23b455/href">https://medium.com/media/ba5c81d6a875b7b71fd9b8047e23b455/href</a></iframe><h3>FHIR Operations and Server-Wide Operations Comparison</h3><p>Import and export functionalities for HeathLake are only designed to be to and from storage buckets, or object storage, not databases. This means that developers do not have query-ability against the data nor can they visualize or analyze the data without creating custom pipelines to other AWS database products. This is in stark comparison with Google’s integration with their managed data warehouse product, BigQuery, which is done automatically for users. There is also no streaming in or out of the AWS product, making it less likely to be utilized for AI/ML workflows. Below is a more in depth comparison of the operations able to be conducted by the two services.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/03aed92f5b8a2bdcd7490e7fdd5e0616/href">https://medium.com/media/03aed92f5b8a2bdcd7490e7fdd5e0616/href</a></iframe><p>There are also several extended operations the <a href="https://www.hl7.org/fhir/operationslist.html">FHIR community has defined</a> that Google Cloud supports that are currently not supported in the AWS product. <a href="https://www.hl7.org/fhir/patient-operation-everything.html">Patient $everything</a> gives users the ability to fetch all the resources around one patient and is currently only supported in the <a href="https://cloud.google.com/healthcare/docs/reference/rest/v1beta1/projects.locations.datasets.fhirStores.fhir/Patient-everything">Google Cloud product</a>. <a href="https://www.hl7.org/fhir/observation-operation-lastn.html">Observation $lastn</a> is a second FHIR wide call that allows users to pull the last “n” number of observations for a certain subject, and is currently also only supported in the Google Cloud product.</p><p>Furthermore, Google has robust console integration for their FHIR stores, allowing for import and export to be done on the console UI as demonstrated, however, also creation and deletion of stores — and additional functionality such as deidentification.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*pd_jGBFPbppAuZfl" /><figcaption>Creation of a FHIR Datastore using Google Cloud’s Console (UI)</figcaption></figure><h3>Rest API calls Comparison</h3><p>The table below highlights the differences between the rest API calls of the two services. AWS supports very minimal API functionalities compared to the API specification <a href="https://www.hl7.org/fhir/">outlined by the FHIR community.</a></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/493f0497143d6b25fd93a2429e6b44c0/href">https://medium.com/media/493f0497143d6b25fd93a2429e6b44c0/href</a></iframe><h3>Search Comparison</h3><p><a href="https://www.hl7.org/fhir/search.html">Search</a> can be an extremely useful FHIR operation for users. The following table has general search functionalities and what each product supports. On top of this table, Google supports a <a href="https://cloud.google.com/healthcare/docs/how-tos/fhir-advanced-search">number of advanced search capabilities</a> such as sorting, chained parameters, and reverse chaining which are not supported in the AWS environment.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/62aca2f840e1f9417f522f4d1d46403b/href">https://medium.com/media/62aca2f840e1f9417f522f4d1d46403b/href</a></iframe><h3>Pricing</h3><p>Note: AWS’ HealthLake is currently free as it is still in preview. This pricing is based on their public documentation and both vendors pricing is subject to change. This pricing analysis was conducted on 05/12/2021.</p><h3>Google Cloud</h3><p><a href="https://cloud.google.com/healthcare/pricing">Google Cloud’s pricing</a> is based on data storage and API requests. Structured storage has multiple tiers, their free tier up to a GB per month, $0.39 per GB per month up to 1 TB, then it drops to $0.34 per GB per month above 1 TB. The API pricing also has multiple tiers, the free tier covering up to 2.5 billion requests per month. After the free tier the requests are broken down into standard, complex, and multi-operation requests. For standard and multi-operation requests, the API is $0.39 per 100,000 a month, and $0.29 after a quintillion of them (wow!). Complex requests run at $0.69 per 100,000 a month, dropping to $0.59.</p><h3>AWS</h3><p><a href="https://aws.amazon.com/healthlake/pricing/">AWS’ pricing</a> is also broken out into data storage and API requests, with an additional runtime charge for server costs. The Data Store cost to run is $0.27 per Data Store per hour. The free tier includes 10 GB of storage, then jumps to $0.25 per GB stored per month. For API requests, AWS offers the first 2.52 million requests per month for free, and then charged $0.015 per 10,000 queries per hour, rounded to the nearest 10,000.</p><h3>Compare</h3><p>AWS does have a larger free tier for data storage than Google Cloud at 10 GB versus Google’s 1 GB. That being said, AWS also charges for server runtime, a cost GCP’s FHIR API does not incur. If a user was to run a server 24/7 for 30 days, that would cost around $194.40. AWS has a lower storage cost at $0.25 GB per month, compared to Google Cloud’s $0.39 GB per month. The API cost for AWS is calculated per hour, while Google Cloud’s is calculated per month — making it difficult to make a 1:1 comparison.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/9a0d9e49e61850370ca6eea80ccaf680/href">https://medium.com/media/9a0d9e49e61850370ca6eea80ccaf680/href</a></iframe><p>I have calculated the amount required to store 100 GB of data for a month while querying the FHIR store 1,000 times a minute for both services.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/61e0b5b7e6d1b9ebb46ace4197dcc9e9/href">https://medium.com/media/61e0b5b7e6d1b9ebb46ace4197dcc9e9/href</a></iframe><p>HealthLake is a cheaper FHIR option for storage and API calls, however, charges almost 200 dollars a month for running a FHIR store. This could be an unfriendly option for smaller organizations or small workloads looking to test FHIR, or, for larger organizations whose strategy revolves around having many FHIR stores.</p><p>Note on the API free tier: With 3,500 queries per hour free, this is 56,500 an hour. That being said, since it rounds up to the nearest 10,000 queries per hour, it is still charged at 60,000 an hour — or $0.09 an hour. The free tier for AWS seems to be a little misleading, since they round up to the nearest 10,000. So if a user queried 13,501 times, with a free tier that makes 10,001 queries, yet, AWS would charge a user for 20,000.</p><h3>Limitations in Preview</h3><p>AWS has restrictions in preview currently documented <a href="https://docs.aws.amazon.com/healthlake/latest/devguide/limits.html">here.</a> These limitations are very limiting, and due to these limitations and the early preview status, an enterprise organization would likely be unable to utilize this in production.</p><h3>Out of Scope</h3><p>Both Google Cloud and AWS have medical NLP products as part of their healthcare offerings. This article does not dive into the functionalities of either, as the likely most useful comparison would be to review accuracy of each — requiring a third-party study and review.</p><h3>Summary</h3><p>Google’s FHIR API when compared 1:1 with AWS’s HealthLake supports double the amount of FHIR resources, all FHIR versions (in comparison with just R4 in AWS) and more capabilities to view and analyze the FHIR data. In a feature by feature review, Google has significantly more API functionalities than what AWS offers — including extended operations and conditional operations. Google’s API has more comprehensive search capabilities and broader support for things like FHIR profile validation and pagination. Google has tighter integration with its larger product suite thus allowing for less overhead and management on users. Google supports streaming of data, unlike AWS’s batch-only model, and thus is a more attractive option for machine learning or application use cases. Finally, AWS pricing is more attractive, however, Google FHIR offers more advanced FHIR capabilities that are necessary for enterprise data management. Try both out and decide for yourself at <a href="https://cloud.google.com/free?utm_campaign=na-US-all-en-dr-skws-all-all-trial-b-dr-1009135&amp;utm_term=KW_%2Bcloud+%2Btrial-ST_%2Bcloud+%2Btrial&amp;gclid=Cj0KCQjwvIT5BRCqARIsAAwwD-RUQiq-He78t3eUQ0Sa0ufT6FVemrq7WjacDHlYQ-hMcYQ8B0RPrC0aAoCHEALw_wcB&amp;utm_content=text-ad-none-any-DEV_c-CRE_112149298447-ADGP_Hybrid+%7C+AW+SEM+%7C+SKWS+%7C+US+%7C+en+%7C+BMM+%7E+Cloud+Trial-KWID_43700009826738604-kwd-32980698855&amp;utm_source=google&amp;utm_medium=cpc">Google Cloud</a> and <a href="https://aws.amazon.com/healthlake/">AWS.</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e8d8359e1412" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Supporting Healthcare Data Standards at Google Cloud]]></title>
            <link>https://vneilley.medium.com/supporting-healthcare-data-standards-at-google-cloud-e0254e543053?source=rss-a393b3043091------2</link>
            <guid isPermaLink="false">https://medium.com/p/e0254e543053</guid>
            <category><![CDATA[ohdsi]]></category>
            <category><![CDATA[fhir]]></category>
            <category><![CDATA[omop]]></category>
            <category><![CDATA[hl7]]></category>
            <category><![CDATA[gcp]]></category>
            <dc:creator><![CDATA[Vivian Neilley]]></dc:creator>
            <pubDate>Mon, 01 Mar 2021 23:29:26 GMT</pubDate>
            <atom:updated>2021-03-02T00:21:54.454Z</atom:updated>
            <content:encoded><![CDATA[<p>Today was a big day in the world of healthcare data standardization. Health Level Seven International (HL7®) and Observational Health Data Sciences and Informatics (OHDSI) <a href="https://forums.ohdsi.org/t/hl7-ohdsi-collaboration-announcement/13381">announced a collaboration</a> to better integrate with each other’s data standards: Fast Healthcare Interoperability Resources (FHIR®) and OHDSI’s Observational Medical Outcomes Partnership (OMOP) common data model respectively.</p><p>TL;DR this partnership will allow clinical data coming from EHRs, applications, or other sources in the FHIR format to be utilized with research data in the OMOP standard. This has been a common use case - most notably with <a href="http://omoponfhir.org/">GT-FHIR2, the OMOP on FHIR Project</a>. This project was built out of Georgia Tech and allows for mapping between FHIR and OMOP common data model (CDM).</p><p>Google Cloud has long recognized the importance of each of these standards and has built out products and solutions for both, such as the <a href="https://cloud.google.com/healthcare">Google Cloud Healthcare API</a>, <a href="https://cloud.google.com/blog/topics/healthcare-life-sciences/powering-open-source-healthcare-research-on-google-cloud">ATLAS on GCP</a>, and provides large, synthetic, public datasets in both the <a href="https://console.cloud.google.com/marketplace/product/mitre/synthea-fhir">FHIR format</a> and the <a href="https://console.cloud.google.com/marketplace/product/hhs/synpuf">OMOP data model</a>.</p><p>Recognizing the need to interoperate between the standards, Google Cloud also formed a partnership with <a href="https://odysseusinc.com/about-us/">Odysseus Data Services</a> to assist customers with the <a href="https://odysseusinc.com/services/omop-conversion/">conversion of data to OMOP</a>, deployment of research applications such as <a href="https://console.cloud.google.com/marketplace/product/odysseusinc-public/ohdsi-atlas?_ga=2.97094047.-1605455119.1603831526">ATLAS on GCP</a>, and jointly supporting the community with outreach and Google tool integration (like <a href="https://forums.ohdsi.org/t/google-bigquery-support-update/11523">BigQuery support</a>).</p><p>Most recently, Google Cloud created an open source <a href="https://github.com/GoogleCloudPlatform/healthcare-data-harmonization">healthcare data harmonization tool suite</a> to assist users in translating their data to various clinical standards. We are proud to support <a href="https://github.com/GoogleCloudPlatform/healthcare-data-harmonization/tree/master/mapping_configs">the conversion of FHIR to OMOP</a> and look forward to seeing what the new partnership between OHDSI and HL7 will bring to fruition!</p><p><strong>For those more interested in the technical aspects of our mapping engine…</strong></p><h3>Mapping Data to OMOP</h3><p>The Google Cloud Healthcare team has <a href="https://github.com/GoogleCloudPlatform/healthcare-data-harmonization">open sourced a mapping engine</a> that can assist users with harmonizing their data to the OMOP CDM (and many others!). Structural transformation is an important step in building a data transformation pipeline and includes field mapping, parsing, and formatting data. With the open source mapping engine and library, users can easily manage their mapping configurations without the overhead of managing the pipelines.</p><p>The healthcare team has also open sourced reference mappings for <a href="https://github.com/GoogleCloudPlatform/healthcare-data-harmonization/tree/master/mapping_configs/fhir_omop">FHIR to OMOP</a> using the Georgia Tech references to accelerate OMOP adoption for those who already have their data in the FHIR standard. This reference mapping can allow researchers to utilize applications built on the OMOP standard or help further analytics in clinical research use cases.</p><p>For more information <a href="https://www.himsslearn.org/building-transformation-pipelines-support-ohdsi-tools">check out the joint Google Cloud/Odysseus HIMSS session</a> conducted on creating transformation pipelines on Google Cloud for the OHDSI toolsuite!</p><h3>Using the OHDSI toolsuite on GCP</h3><p>The OHDSI tool can support many analytics use cases, such as cohort definition, cohort generation and population effect estimation using core OHDSI components (Achilles, WebAPI and ATLAS). These tools have been enhanced to interoperate with BigQuery (and other Google Cloud components), and can be enhanced by use of other Google Cloud offerings, such as Google’s <a href="https://console.cloud.google.com/marketplace/product/hhs/synpuf?filter=solution-type:dataset&amp;q=synpuf&amp;id=c77e3443-4391-4aef-9e29-070e4301cba3">published OMOP synthetic patient dataset</a> and <a href="https://github.com/GoogleCloudPlatform/healthcare-data-harmonization">on-going open source efforts to map data to the OMOP standard</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/942/0*VfreGLZ7550agOSo" /><figcaption>Architecture for ATLAS on GCP</figcaption></figure><blockquote>“The introduction of the Google BigQuery into the OHDSI ecosystem allows for unlimited scalability and elasticity for multiple OHDSI collaborators who are utilizing Google Cloud Platform (GCP). The ability to host multi-terabyte data sets while getting fast responses for complex analytical queries enables the execution of internal and collaborative network research. Going forward, Google and Odysseus have partnered in providing ongoing support for OHDSI ATLAS and other tools and methods on GCP platform.”</blockquote><blockquote>Gregory Klebanov, Chief Technology Officer (CTO) at Odysseus Data Services</blockquote><h3>To summarize my thoughts… In someone else’s words</h3><blockquote>“This partnership closes the loop from research to clinical impact, potentially enabling analytics and models validated on real-world observational data to be put into practice within a health system by leveraging the interoperability standards for healthcare data.”</blockquote><p>Marianne Slight, Product Manager for Google Cloud Healthcare and Life Sciences</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*X4jQBMkgWSqJ28m0" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e0254e543053" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Are all FHIR APIs the Same?]]></title>
            <link>https://vneilley.medium.com/are-all-fhir-apis-the-same-48be75ac4ac5?source=rss-a393b3043091------2</link>
            <guid isPermaLink="false">https://medium.com/p/48be75ac4ac5</guid>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[azure]]></category>
            <category><![CDATA[healthcare]]></category>
            <category><![CDATA[fhir]]></category>
            <category><![CDATA[hl7]]></category>
            <dc:creator><![CDATA[Vivian Neilley]]></dc:creator>
            <pubDate>Tue, 11 Aug 2020 13:58:02 GMT</pubDate>
            <atom:updated>2021-05-19T14:36:51.244Z</atom:updated>
            <content:encoded><![CDATA[<h3>An in depth analysis of Microsoft Azure’s FHIR API versus Google Cloud’s Healthcare API for FHIR as of August 2020</h3><p>Disclaimer: I am employed at Google Cloud as a Solution Architect.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*60C2bboUJBqkd1DiRnCJkA.png" /></figure><h3>Introduction</h3><p>After spending a week at the FHIR DevDays conference back in June, two main players stuck out as leaders in the fully managed FHIR (Fast Healthcare Interoperability Resources) API Cloud space — Google Cloud and Microsoft Azure. At the event the two organizations had relatively similar demonstrations, showing HL7v2 to FHIR conversions, de-identification functionalities, and visualization capabilities for each. I began to wonder, is there documentation on the difference between the two organizations and offerings? So I decided to dig.</p><p>This is an in-depth analysis of the current state for each API. I attempt an unbiased review of both Azure API for FHIR and Google Cloud’s Healthcare FHIR API. This reflects the state of both APIs as of August 2020. Azure launched to public preview on February 7th, 2019 and was generally available October 21st, 2019. Documentation for the product can be found <a href="https://azure.microsoft.com/en-us/services/azure-api-for-fhir/#documentation">here</a>. Google Cloud launched to Early Access on March 16th, 2018, Beta on April 4th, 2019 and was generally available April 9th, 2020. Documentation for the product can be found <a href="https://cloud.google.com/healthcare/docs/concepts/fhir">here</a>.</p><h3>Infrastructure</h3><h4>Google Cloud</h4><p>Although you won’t find it in the public documentation, the underlying infrastructure for the API is built on Spanner, the same technology that powers <a href="https://cloud.google.com/spanner/?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=na-US-all-en-dr-bkws-all-all-trial-e-dr-1009135&amp;utm_content=text-ad-none-any-DEV_c-CRE_178649616666-ADGP_Hybrid+%7C+AW+SEM+%7C+SKWS+%7C+US+%7C+en+%7C+Multi+~+Spanner-KWID_43700018041306779-kwd-100039195&amp;utm_term=KW_spanner-ST_spanner&amp;gclid=Cj0KCQjwgo_5BRDuARIsADDEntTO-hUnH8OFwkO_FECiJhs86qVVTaNFiaygwpOeUnsL_8-0c-WLc1EaAtZJEALw_wcB">Google Cloud Spanner</a>. Google Cloud Spanner is described as a “fully managed relational database with unlimited scale, strong consistency and up to 99.999% availability.” It is a first of its kind database, claiming to <a href="https://cloud.google.com/blog/products/gcp/inside-cloud-spanner-and-the-cap-theorem">break the CAP theorem</a>, having both analytics and transactional functionalities. Spanner ensures <a href="https://cloud.google.com/spanner/docs/true-time-external-consistency">“TrueTime” external consistency</a> which is the strongest form of consistency one can achieve for transactions in a distributed system. On top of the Spanner infrastructure, Google Cloud’s Healthcare API is tightly integrated with additional proprietary technologies such as indexing and queuing features to achieve its performance and scalability.</p><h4>Azure</h4><p>Azure offers two types of deployments for their FHIR API. The first is an <a href="https://github.com/Microsoft/fhir-server">open source version </a>that can be deployed on any infrastructure, including Azure, and enables application developers to manage their own server and control the backend. The second is a managed deployment; this article focuses exclusively on the managed API.</p><p>For Azure’s managed deployment, the API leverages a managed <a href="https://azure.microsoft.com/en-us/services/cosmos-db/">Cosmos DB</a> instance. Cosmos DB is described as “a fully managed NoSQL database service for modern app development with guaranteed single-digit millisecond response times and 99.999% availability.”</p><h4>Compare</h4><p>There have been a lot of comparison articles between Cosmos DB and Spanner, so I will not cover the database differences, rather, the API differences in this article. Both APIs leverage performant, high availability back-end systems for their FHIR data storage, yet neither API provides direct access to the underlying datastore. While Azure has published SLA numbers <a href="https://azure.microsoft.com/en-us/support/legal/sla/azure-api-for-fhir/v1_0/">here</a>, Google has yet to publish their SLAs for the product.</p><p>Overall, Google Cloud has less published information on their infrastructure as a fully managed service, which is deliberate since Google has abstracted away the need to understand how the API is built so that users can focus solely on the functionality. A true comparison of the infrastructure would come from the performance numbers and tests against each, which is not covered in this article.</p><p>Both API presentations at FHIR DevDays had users leverage something other than their managed service in order to visualize the data. Google Cloud demonstrated the export capability from the FHIR store to their managed Data Warehouse product <a href="https://cloud.google.com/bigquery">BigQuery</a> — with no need for schema definition or DDL scripts. They also demonstrated how <a href="https://cloud.google.com/blog/topics/inside-google-cloud/google-completes-looker-acquisition">their recent acquisition of Looker</a> can allow for users to access and visualize the data sans-code. From Azure’s DevDays demo, they leveraged <a href="https://powerbi.microsoft.com/en-us/">PowerBI</a> by <a href="https://docs.microsoft.com/en-us/power-query/connectors/fhir/fhir">connecting it directly to their FHIR store</a>. While this required more schema definition than the Google counterpart (albeit, UI based) the end result was similar in nature.</p><h3>Scalability</h3><h4>Google Cloud</h4><p>Google Cloud’s FHIR API is fully managed and does not require users to configure, set, or otherwise tune their infrastructure in any way. While this may be unfamiliar to legacy or on premise users, this can be a huge advantage for reducing overhead and operational costs usually associated with similar developments or an open source implementation. Not only does the database automatically scale to meet additional capacity needs with no operator intervention, the servers required for operations also automatically scale with use.</p><h4>Azure</h4><p>CosmoDB requires users to not only <a href="https://docs.microsoft.com/en-us/azure/cosmos-db/partitioning-overview">manage their partitioning</a> but also set the <a href="https://docs.microsoft.com/en-us/azure/cosmos-db/request-units">number of request units</a> for CosmoDB. Request Units (RUs) are what operators utilize for throughput and/or operations against the database. When the database is provisioned, users set the amount of RU’s they want to reserve for capability — meaning, users have to pay for enough resource units in Cosmos to ensure FHIR resources are available and accessible to users at all times. This may mean users are over-provisioning and underutilizing their infrastructure, or paying for more than what they may need. More about how to configure Cosmos DB can be found <a href="https://docs.microsoft.com/en-us/azure/healthcare-apis/configure-database">here</a>.</p><h4>Compare</h4><p>Azure end users have to describe their scaling parameters and configurations in order to meet scaling needs thus it does not seamlessly scale without customer management like its Google Cloud counterpart. Additionally, it may be difficult for users to plan their capacity and usage of resource units, since there is a lack of documentation on how many and what type of API requests require what amount of RUs.</p><h3>Pricing</h3><p>Note: This section only touches on the storage pricing of each of the APIs. For API call pricing, the two vendors handle the requests differently (Azure by pre-purchased resource units, Google by on-demand pricing). Due to the lack of a 1:1 comparison, API based pricing is not evaluated. This pricing analysis was conducted on 08/11/2020.</p><h4>Google Cloud</h4><p><a href="https://cloud.google.com/healthcare/pricing">Google Cloud’s pricing</a> is relatively straightforward. When the API launched to GA, they removed the runtime and server costs. Structured storage has multiple tiers, their free tier up to a GB per month, $0.39 per GB per month up to 1 TB, then it drops to $0.34 per GB per month above 1 TB.</p><h4>Azure</h4><p><a href="https://azure.microsoft.com/en-us/pricing/details/azure-api-for-fhir/">Azure’s pricing</a> can be broken out into two different categories, server costs and storage costs. Unlike its Google Cloud counterpart, Azure does charge for server cost, which is an additional $292.00 a month if the FHIR server is running 24/7. For storage pricing, Azure’s as-is storage price may look more appealing at first, coming in at $0.25 per GB per month, however, there are additional costs beyond the API storage that users need to consider. According to Cosmo DB’s documentation <a href="https://docs.microsoft.com/en-us/azure/cosmos-db/request-units">here</a>, each GB of data also requires 10 RU/s for storage on top of the storage pricing. Since 100 RU/s is 0.008/hour, and assuming users want to store for 24 hours a day for a month (30 days) — that means there is an additional $0.576/GB charge for resource units just to store the data. This turns the $0.25/GB/month that is advertised into $0.826/GB/month (calculation for these assumptions can be found <a href="https://cosmos.azure.com/capacitycalculator/">here</a>).</p><h4>Compare</h4><p>After calculating the necessary infrastructure costs just to store data, Azure comes in more than double for storage costs of what GCP is (comparing $0.39/GB/month for GCP to $0.826/GB/month for Azure). Google Cloud does not have any runtime costs where Azure has almost 300 dollars a month for each store. When you factor in the fact GCP’s pricing model is pay for what you use, which can be more appealing to buyers, versus Azure’s model is pay for what you think you might need: couple this with Azure’s ambiguity on how many resource units are needed for API calls, various transactions, etc, and the cheaper pricing model GCP has, Google Cloud has a more appealing FHIR pricing model.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/faf45e9967bd5f4b4fdd2acbe53750af/href">https://medium.com/media/faf45e9967bd5f4b4fdd2acbe53750af/href</a></iframe><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ab8a6bfb6c4e57a8ad4a52ef67742606/href">https://medium.com/media/ab8a6bfb6c4e57a8ad4a52ef67742606/href</a></iframe><p>I have gone to both pricing calculators and calculated the amount required to store 100 GB of data for a month. Google came in at $155.61 dollars per month (<a href="https://cloud.google.com/products/calculator#id=87b1529d-a2dd-4e88-8c21-a21d89aa92a5">here</a>), while Azure sat at $315.36 dollars per month (<a href="https://azure.microsoft.com/en-us/pricing/calculator/?&amp;ef_id=CjwKCAjw88v3BRBFEiwApwLevSI-2J97KlxJyXnFTI8vqd35zBC0EumzD2DVSSf66OIbGDkju8DaERoC0mkQAvD_BwE:G:s&amp;OCID=AID2000128_SEM_CjwKCAjw88v3BRBFEiwApwLevSI-2J97KlxJyXnFTI8vqd35zBC0EumzD2DVSSf66OIbGDkju8DaERoC0mkQAvD_BwE:G:s&amp;gclid=CjwKCAjw88v3BRBFEiwApwLevSI-2J97KlxJyXnFTI8vqd35zBC0EumzD2DVSSf66OIbGDkju8DaERoC0mkQAvD_BwE">here</a>, under “saved estimates”).</p><h3>FHIR Version Support Comparison</h3><p>The following table lists the currently supported versions by each API. DSTU2 support may be important to you if your ecosystem includes systems that produce or consume FHIR in this format.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a530b39db9ebfe73d4039f3fc4fe7674/href">https://medium.com/media/a530b39db9ebfe73d4039f3fc4fe7674/href</a></iframe><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/8de3b9aaefcb971ce4d31d16d05f190e/href">https://medium.com/media/8de3b9aaefcb971ce4d31d16d05f190e/href</a></iframe><h3>FHIR Operations and Server-Wide Operations Comparison</h3><p>There are also several extended operations the <a href="https://www.hl7.org/fhir/operationslist.html">FHIR community has defined</a> that Google Cloud supports that are currently not supported in the Azure product. <a href="https://www.hl7.org/fhir/patient-operation-everything.html">Patient $everything</a> gives users the ability to fetch all the resources around one patient and is currently only supported in the <a href="https://cloud.google.com/healthcare/docs/reference/rest/v1beta1/projects.locations.datasets.fhirStores.fhir/Patient-everything">Google Cloud product</a>. <a href="https://www.hl7.org/fhir/observation-operation-lastn.html">Observation $lastn</a> is a second FHIR wide call that allows users to pull the last “n” number of observations for a certain subject, and is currently also only supported in the Google Cloud product. Google also has a list of extended operations supported such as <a href="https://www.hl7.org/fhir/operation-conceptmap-translate.html">concept map translate</a>.</p><p>Finally, there is a lack of bulk import functionality in Azure’s FHIR API, as it is missing from their <a href="https://github.com/microsoft/fhir-server/tree/master/docs">open source documentation</a> and was called out on several <a href="https://stackoverflow.com/questions/61483216/sending-bulk-data-to-azure-fhir-server">community posts.</a> The lack of bulk import for the Azure FHIR store can be difficult for users who are looking to ingest bundles that are already persisted somewhere else. The lack of documentation for their store-wide operations makes it difficult to understand which operations user may not be able to perform. Conversely, Google Cloud supports a wide variety of server wide operations that can be performed on the FHIR store, with supporting documentation <a href="https://cloud.google.com/healthcare/docs/reference/rest/v1beta1/projects.locations.datasets.fhirStores.fhir">here</a>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/813497a9c709856b4635310fef345305/href">https://medium.com/media/813497a9c709856b4635310fef345305/href</a></iframe><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5a483f33517b0ab9c42c9368d61083b0/href">https://medium.com/media/5a483f33517b0ab9c42c9368d61083b0/href</a></iframe><h3>Rest API Calls Comparison</h3><p>Each environment has a set of baseline supported methods based on <a href="https://cloud.google.com/healthcare/docs/reference/rest/v1beta1/projects.locations.datasets.fhirStores.fhir">Google Cloud</a> and <a href="https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir-features-supported">Azure’s</a> documentation.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2467b9ad7b30a0c84cacc712097e7a39/href">https://medium.com/media/2467b9ad7b30a0c84cacc712097e7a39/href</a></iframe><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1cf83611a87848d5fcce6344c67b4092/href">https://medium.com/media/1cf83611a87848d5fcce6344c67b4092/href</a></iframe><h3>Transaction Bundle Support Comparison</h3><p>One of the largest advantages Google Cloud has is the <a href="https://cloud.google.com/healthcare/docs/how-tos/fhir-bundles">support for transaction bundles</a>. Azure’s managed FHIR API <a href="https://docs.microsoft.com/en-us/azure/healthcare-apis/fhir-features-supported">does not support transaction bundle types</a> which can make streaming implementations difficult. <a href="https://www.hl7.org/fhir/bundle-transaction.html">Transaction bundles</a> allow for multiple operations in a single request — often these transactions are connected. For example, if your bundle has an Encounter and an Observation resource — transaction bundles ensure if one resource fails the bundle fails — versus batch may write one without the other. What this means is that your server might store an Observation without ever recording the Encounter. Furthermore, batch calls do not allow for users to reference other resources inside the bundle, as they do not create the same server-assigned identifiers. This could become detrimental when users are attempting to build something like a <a href="https://www.hl7.org/fhir/provenance.html">Provenance resource</a> in FHIR that needs to be able to reference other resources. This can make it extremely difficult to join resources in analysis that were processed in a batch bundle — as the traditional primary key is missing. For more information on business identifiers, visit: <a href="https://www.hl7.org/fhir/resource.html#identifiers">https://www.hl7.org/fhir/resource.html#identifiers</a></p><h3>Search Comparison</h3><p><a href="https://www.hl7.org/fhir/search.html">Search</a> can be an extremely useful FHIR operation for users. The following table has general search functionalities and what each product supports. On top of this table, Google supports a <a href="https://cloud.google.com/healthcare/docs/how-tos/fhir-advanced-search">number of advanced search capabilities</a> such as sorting, chained parameters, and reverse chaining which are not supported in the Azure environment.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/0a090b299850bd6c332a68dca578fa70/href">https://medium.com/media/0a090b299850bd6c332a68dca578fa70/href</a></iframe><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b77f57b33d15b0e774a010450732a948/href">https://medium.com/media/b77f57b33d15b0e774a010450732a948/href</a></iframe><h3>De-identification (De-ID)</h3><h4>Google Cloud</h4><p>Google Cloud’s Healthcare API has built-in functionality for <a href="https://cloud.google.com/healthcare/docs/how-tos/fhir-deidentify">de-identification of FHIR resources</a>. Since it is built into the API product, the de-identification functionality is also covered under the Google Cloud BAA and is a true managed service. This also means the API can be called from the <a href="https://cloud.google.com/healthcare/docs/how-tos/fhir-deidentify#de-identifying_data_in_the">Google Cloud Console in the Healthcare Data Browser</a> for added simplicity.</p><p>In terms of functionalities, Google Cloud allows users of the de-identification FHIR endpoint to <a href="https://cloud.google.com/healthcare/docs/how-tos/fhir-deidentify">create their own rules</a> for processing FHIR resources and create custom de-identification templates. GCP’s de-identification also supports customization at the field-level and offers additional customization at the <a href="https://cloud.google.com/healthcare/docs/how-tos/fhir-deidentify#using_infotypes_and_primitive_transformations_with_fhir_resources">infotype</a> (e.g. AGE, LOCATION, etc.) level and sub-field level. On top of the functionalities within the API, there is a second product in Google Cloud, called the <a href="https://cloud.google.com/dlp">Cloud Data Loss Prevention API</a>, that allows for further redaction of strings, images, and tabular data.</p><h4>Azure</h4><p>Azure recently released an open source project called <a href="https://github.com/microsoft/FHIR-Tools-for-Anonymization">FHIR Tools for Anonymization</a>. According to documentation, this tool suite helps users de-identify 17 types of PII both on-premise and in the cloud. The tool is designed to process R4 data and allows for configurations at the field-level.</p><p>It is important to understand the workflow of the tool in order to compare it with Google Cloud’s counterpart. The tool pulls data from <a href="https://github.com/microsoft/FHIR-Tools-for-Anonymization">Azure’s blob storage and processes the data on Data Factory with OSS pipelines</a>. The only pipelines that have been published are bulk pipelines, thus sending bulk FHIR data through Data Factory and back to object storage. The issue lies in the fact there is no bulk-import functionality in the FHIR API as discussed earlier in this post. That means, there is no workflow on how to do data de-identification and to bring it back into the FHIR server in bulk.</p><p>Configurations only support the built in methods — keep, redact, date shift, and crypto hash. Azure’s de-identification functionality is also limited, they only support rules-based processing of FHIR R4 data. Azure’s response for free-text sections is to delete them, meaning that the user loses access to a significant amount of medical and patient context within the record. Azure calls out that they do not allow for custom de-identification methods in the documentation <a href="https://github.com/microsoft/FHIR-Tools-for-Anonymization#faq">here</a>.</p><h4>Comparison</h4><p>Azure came later to the table, releasing their functionality in March of 2020 when compared to Google Cloud’s release in 2018. The difference also lies in the fact GCP’s is a managed service that means users are not responsible for the underlying tool set instead of setting up a specific environment for the process like Azure’s. Azure does not have a defined workflow that allows users to store their de-identified data back into the FHIR store once complete, leaving it in object storage. This is a stark contrast to Google’s endpoint which reads from a FHIR store and writes into a secondary FHIR store, with no need for additional products or pipeline.</p><p>From a de-identification perspective, Azure’s tools support only structured data and are limited to rules-based processing. They are also limited in only being able to apply rules at a field-level, so there is no logic for sub-field and infotype specifications like Google supports. Finally, Google goes beyond rules-based processing by introducing some of the AI-based processing to <a href="https://cloud.google.com/dlp/docs/deidentify-sensitive-data">detect PII/PHI within sections of free-text</a>. This allows for retaining non-PII/PHI components of free-text fields, which can be useful for downstream analyses and applications.</p><p>Google supports DSTU2, STU3, R4 — so the variety of use cases Google Cloud can support is more robust than Azure’s that only supports R4.</p><h3>Notifications and Database Changes</h3><h4>Google Cloud</h4><p>Google Healthcare API has the ability to associate <a href="https://cloud.google.com/healthcare/docs/how-tos/pubsub">every FHIR store with a Pub/Sub topic</a> for push based notifications that can be configured on the UI per store. This is a managed service that <a href="https://cloud.google.com/pubsub/docs/overview">automatically scales</a> by distributing loads without pre-purchasing involved. By creating multiple subscriptions to each topic, routing for each notification can be done within the product without processing. To trigger a processing event beyond routing, users have to <a href="https://cloud.google.com/functions/docs/calling/pubsub">manually create triggers</a> for Pub/Sub topics.</p><h4>Azure</h4><p>Database changes rely on <a href="https://docs.microsoft.com/en-us/azure/cosmos-db/change-feed">CosmosDB change feeds</a>, which do not currently log deletes or specific types of operations. The change feed can send data to an <a href="https://docs.microsoft.com/en-us/azure/cosmos-db/change-feed-functions">Azure Function</a> or a <a href="https://docs.microsoft.com/en-us/azure/cosmos-db/change-feed-processor">Change Feed Processor</a> for further analysis. Users have to <a href="https://docs.microsoft.com/en-us/azure/cosmos-db/change-feed-functions">manually create triggers</a> for the change feed if utilizing an Azure Function using Visual Studio or CLI tooling, or implement a <a href="https://docs.microsoft.com/en-us/azure/cosmos-db/change-feed-processor">change feed processor</a>.</p><p>Azure’s event hub is designed to store all the change feed data for <a href="https://docs.microsoft.com/en-us/azure/cosmos-db/changefeed-ecommerce-solution">streaming solutions</a>. There is also no <a href="https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-features#event-consumers">push model supported that is not through AMQP</a>, since the change feed is not push based.</p><h4>Comparison</h4><p>The ease of use that Google provides through Pub/Sub when monitoring database changes reduces the amount of custom logic in a streaming pipeline. Pub/Sub seems to be a more packaged solution when it comes to streaming analytics, as it has automatic capturing, storage, and routing built in, unlike its counterpart. The lack of logging for deletion or specific types of operations in the Azure environment, without custom code, could also lead to compliance issues or difficulty in further processing. Finally, Azure lacking support for a push model natively is a drawback when compared with the Google Cloud environment.</p><h3>Summary</h3><p>In a feature by feature review, Google appears to have more API functionalities, surrounding data functionalities (such as search and de-identification), and tighter integration with its larger product suite. Based on the storage pricing described in the ‘Pricing’ section above, Google also appears to have a more attractive pricing model, coming in around half the cost per GB (at 100 GB) compared with the Azure API. Try both out and decide for yourself at <a href="https://cloud.google.com/free?utm_campaign=na-US-all-en-dr-skws-all-all-trial-b-dr-1009135&amp;utm_term=KW_%2Bcloud+%2Btrial-ST_%2Bcloud+%2Btrial&amp;gclid=Cj0KCQjwvIT5BRCqARIsAAwwD-RUQiq-He78t3eUQ0Sa0ufT6FVemrq7WjacDHlYQ-hMcYQ8B0RPrC0aAoCHEALw_wcB&amp;utm_content=text-ad-none-any-DEV_c-CRE_112149298447-ADGP_Hybrid+%7C+AW+SEM+%7C+SKWS+%7C+US+%7C+en+%7C+BMM+%7E+Cloud+Trial-KWID_43700009826738604-kwd-32980698855&amp;utm_source=google&amp;utm_medium=cpc">Google Cloud</a> and <a href="https://azure.microsoft.com/en-us/free/search/?&amp;ef_id=Cj0KCQjwvIT5BRCqARIsAAwwD-TtWSCRkhSuY9Po2HMQoCMfhVhAFwkcHJKkMgjbj798OLnFpxgwqc4aAt5_EALw_wcB:G:s&amp;OCID=AID2100131_SEM_Cj0KCQjwvIT5BRCqARIsAAwwD-TtWSCRkhSuY9Po2HMQoCMfhVhAFwkcHJKkMgjbj798OLnFpxgwqc4aAt5_EALw_wcB:G:s&amp;gclid=Cj0KCQjwvIT5BRCqARIsAAwwD-TtWSCRkhSuY9Po2HMQoCMfhVhAFwkcHJKkMgjbj798OLnFpxgwqc4aAt5_EALw_wcB">Azure</a>.</p><h3>Addendum</h3><p>Google Cloud <a href="https://github.com/GoogleCloudPlatform/healthcare-data-harmonization">recently open sourced</a> an <a href="https://github.com/GoogleCloudPlatform/healthcare-data-harmonization/tree/master/mapping_engine">engine that converts data</a> into a common data model and provided <a href="https://github.com/GoogleCloudPlatform/healthcare-data-harmonization/tree/master/mapping_configs">reference mappings</a> for HL7v2 to FHIR R4, HL7v2 to FHIR STU3, and FHIR to OMOP. This push to enable users to bring legacy data and streaming HL7 messages to their FHIR store is an additional differentiator for Google Cloud.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=48be75ac4ac5" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>