Pesquisar

Article
· 10 hr ago 6m read

Maintaining FIFO Processing with Pool Size Greater Than 1

Introduction

The recent addition of FIFO groups allows First-In, First-Out (FIFO) message processing to be maintained in an interoperability production even when a Pool Size is greater than 1, enabling higher performance without sacrificing correctness. This feature first appears in InterSystems IRIS® data platform, InterSystems IRIS® for Health, and InterSystems Health Connect™ in version 2025.3.

First-In, First-Out message processing is critical in many integration scenarios, especially in healthcare. Traditionally, FIFO ordering is enforced by configuring each business host to process only one message at a time (Pool Size = 1). While effective, this approach can limit throughput and underutilize system resources. FIFO groups preserve FIFO ordering where needed without requiring a Pool Size of 1.


FIFO Groups: The Key to Parallelism with FIFO Ordering

FIFO groups provide a way to preserve ordering within a defined group of related messages, while still allowing parallel processing across unrelated groups.

Instead of enforcing FIFO globally, FIFO groups allow you to:

  • Maintain FIFO ordering for messages that depend on each other.
  • Process independent message streams concurrently.

How FIFO Groups Work

  1. Determine a FIFO Group Identifier Identify a value in the message that defines dependency such as patient MRN (Medical Record Number).  Choosing an appropriate FIFO group identifier is crucial. In healthcare a common example is using a patient ID, but any business-specific identifier can be used.
  2. Assign Messages to FIFO Groups Use a Data Transformation or custom code to assign each message a FIFO group identifier based on the value in the message. Messages with the same identifier are guaranteed to be processed in FIFO order.
  3. Enable Parallel Processing Across Groups Messages belonging to different FIFO groups can be processed at the same time. The Pool Size determines how many FIFO groups can be processed concurrently.
  4. Control When FIFO Constraints End Completion hosts can be defined to release FIFO constraints once ordering is no longer required downstream.

When to Use FIFO Groups

Consider FIFO groups when:

  • Pool Size = 1 does not meet performance requirements.
  • FIFO ordering is required for subsets of messages, not globally.
  • CPU utilization is below 80% capacity and parallelism would improve throughput.
  • Message dependencies can be clearly identified (such as by Patient ID, Account Number, or Order ID).

Example: FIFO Group Identifier is Patient ID and Pool Size = 2

Consider a healthcare message scenario with Pool Size = 2:

  • Patient 55, Patient 66 and Patient 77 each have a Pre-admit, Admit and Discharge message sent into the production in that order.
  • Pre-admit, Admit and Discharge messages for Patient 55, Patient 66 and Patient 77 must each be processed in order for that patient.
  • Messages for Patient 55, Patient 66 and Patient 77 are independent.

With FIFO groups:

  • All messages for each patient are processed sequentially.
  • One message for any patient can be processed in parallel with any other patient’s message.
    • For example, the Pre-admits for both Patient 55 and Patient 66 can be processed at the same time.
  • No patient’s message sequence is violated, even though two messages are being processed at the same time.

This approach provides correctness and performance.

For details about processing these messages for Patient 55, Patient 66 and Patient 77, refer to the A Closer Look at How FIFO Groups are Processed section at the end.


Configuring FIFO Group with Pool Size > 1 Example

Production description: Production accepts the data, transforms the data as needed for the downstream system, and sends data to the downstream system. Messages for each patient must be processed in the order received (FIFO).

Step 1: Identify the FIFO Group Identifier

  • Determine what defines message ordering. This value becomes the FIFO group identifier, for example, Patient ID, Account Number, or Order ID.

This example: MRN for the FIFO Group Identifier.

Step 2: Choose the Starting Host

  • Identify where FIFO grouping should begin:
    • Often a business process or routing engine.
    • This is the first business host where messages must be ordered.

This example: Example.MessageRouter

 

Step 3: Create a Data Transformation to compute the FIFO Group Calculation

  • Create a Data Transformation with:
    • Source: the request message type
    • Target: Ens.Queue.FIFOMessageGroup.Data
      • Create=new for the target message
  • Set the following required property:
    • Identifier A string derived from the message (for example, Patient ID).
  • Set any necessary optional properties. Refer to Defining FIFO Groups documentation for details regarding using these properties:
    • Dependencies (optional) Other FIFO groups that must complete first.
    • CompletionHosts (optional) Hosts responsible for releasing FIFO constraints.

This example:

 

Step 4: Configure the Starting Host

  • On the starting business host:
  • Set Group Calculation to the Data Transformation name.
  • This activates FIFO grouping for incoming messages.

This example:

 

Step 5: Set Pool Size > 1

  • Set Pool Size > 1 on the starting host.
  • Pool Size determines how many FIFO groups can process concurrently.
    • For example, Pool Size = 2 allows up to two FIFO groups to be active at once. This determines how many independent messages can be processed at one time.

This example:


Conclusion

By using FIFO groups, productions can safely increase Pool Size beyond 1, allowing parallel processing where possible while preserving strict ordering where necessary. This design is especially valuable in high-volume integrations, where both correctness and scalability are essential.


 A Closer Look at How FIFO Groups are Processed

This section reviews how the processing with FIFO groups works, step by step.

In the diagram below, the current message queue for ER_Router contains the messages in the order they were received from the business service. If ER_Router processes these messages in this exact order, that would preserve FIFO for all messages. However, with FIFO groups in place, ER_Router will not follow this exact order but will still preserve FIFO processing for related messages that require it. The following example illustrates how this works, one step at a time.

Below is an example of simultaneously processing messages for Patient 55, Patient 66 and Patient 77 while maintaining FIFO for each patient. Using Pool Size =2, two messages can be processed at the same time.

START

  • Currently processing two messages: Pre-admit for Patient 55 and Pre-admit for Patient 66.

 


NEXT

  • Pre-admit for Patient 66 completes and Pre-admit for Patient 55 is still being processed.

 

  • Find next message to process:
    • Dequeue Pre-admit for Patient 77 from the top of the queue. Valid to dequeue since no message is currently being processed for Patient 77.

 


NEXT

  • Pre-admit for Patient 77 completes and Pre-admit for Patient 55 is still being processed.

  • Find next message to process:
    • Cannot dequeue Admit or Discharge for Patient 55 from the top of the queue since a message for Patient 55 is still being processed.
      • This is the key to maintaining FIFO: a message cannot be dequeued if another message with the same FIFO group identifier is currently being processed.
    • Can dequeue Admit for Patient 77 since no message for Patient 77 is being processed.

 


NEXT

  • Pre-admit for Patient 55 completes and Admit for Patient 77 is still being processed.

  • Find next message to process:
    • Can dequeue Admit for Patient 55 from top of the queue since no message for Patient 55 is being processed.

 


NEXT

  • Admit for Patient 77 completes and Admit for Patient 55 is still being processed.

  • Find next message to process:
    • Cannot dequeue Discharge for Patient 55 from top of the queue since a message for Patient 55 is still being processed.
    • Can dequeue Admit for Patient 66 since no message for Patient 66 is being processed.

Discussion (0)1
Log in or sign up to continue
Article
· 12 hr ago 2m read

Reviews do Open Exchange - #62

Se um dos seus pacotes no OEX receber uma avaliação, você será notificado pelo OEX apenas sobre o SEU próprio pacote.
A classificação reflete a experiência do avaliador com o estado encontrado no momento da avaliação.
É como um tipo de snapshot e pode ter mudado nesse meio-tempo.
Avaliações feitas por outros membros da comunidade são marcadas com * na última coluna.

Também fiz vários Pull Requests no GitHub quando encontrei algum problema que eu podia corrigir.
Alguns foram aceitos e incorporados, e outros simplesmente foram ignorados.
Portanto, se você fez uma mudança importante e espera uma avaliação atualizada, é só me avisar.

# Package Review Stars IPM Docker *
1 JSON2Persistent Now also available in IPM 6.0 y y  
2 one-to-many-case The first of 2026 5.0 y y  
3 IRIS_dockerization promising composition 4.4   y  
4 GlobalsDB-NodeJS-Admin Historic artefact 3.8      
5 iris-jsonschema just partial working 3.8      
6 GlobalsDB-Admin-NodeJS Historic artefact #2 3.5      
7 Pivot Partner product promotion 3.4      
8 DbVisualizer good product description 3.0      
9 PIQXL Gateway Good looking product promotion 2.7      
10 Symedical Partner promotion 2.4      
11 Fhirgure a lot of JS 1.4      
12 iknowAV Another artefact 1.2      
13 OMNI-Lab link to integrator 1.2      


NOTA:
Se alguma avaliação não estiver visível para você, pode ser que ainda esteja aguardando aprovação dos administradores do OEX.

Discussion (0)1
Log in or sign up to continue
Announcement
· 13 hr ago

[Video] Innovations in FHIR Data Management

Hey Community,

Enjoy the new video on InterSystems Developers YouTube:

⏯  Innovations in FHIR Data Management@ Ready 2025

Join us for an in-depth session on advancing FHIR data management by leveraging patient matching, clinical data enrichment, and AI decision support. We will explore how FHIR, MPIs, and AI have enhanced patient matching, streamlined interoperability and enabled comprehensive FHIR-based patient summaries at Méderi Hospital. Additionally, we’ll showcase AI-enabled clinical workflows and FHIR data mastering implementations at Stanford Health providing real-time AI responses for triage, CDS, care management, and operational planning to improve care quality.

Presenters:
🗣 @Elijah Cotterrell, Product Manager at InterSystems
🗣 @Kevin Kindschuh, Senior Sales Engineer at InterSystems
🗣 @Matías Fernández, Technical Specialist at InterSystems
🗣 @Bernardo Linarez, Senior Technical Lead at InterSystems
🗣 Satchi Mouniswamy, Sr. Director - Integration at Stanford Healthcare
🗣 Nikesh Kotecha, Head of Data Science at Stanford Health Care

Curious about best practices? Watch this and subscribe for more!

Discussion (0)1
Log in or sign up to continue
Article
· 19 hr ago 5m read

Building a Medical History Chatbot - FHIR, Vector Search and RAG for beginners

Introduction

Earlier this year, I set about creating kit to introduce young techy folk at a Health Tech hackathon to using InterSystems IRIS for health, particularly focusing on using FHIR and vector search.

I wanted to publish this to the developer community because the tutorials included in the kit make a great introduction to using FHIR and to building a basic RAG system in IRIS. Its an all inclusive set of tutorials to show in detail how to:

- Connect to IRIS with Python 
- Use the InterSystems FHIR Server 
- Convert FHIR data into relational data with the **FHIR-SQL builder**
- Use InterSystems **Vector Search** 
- As a bonus using **Ollama** to prompt local AI models 

This repo contains a full series of Jupyter Notebook tutorials for developing a medical history chatbot, as well as various other tutorials on using a FHIR server, so forgive me if this article is slightly light technical detail, but there's plenty of information in the linked Open Exchange Package!
 

Designing the Demo

The design brief I was given was to build a hackathon kit (which I defined as a fully-worked through, easy to follow demo app) that used FHIR data and AI. 

The first question with this kind of project is where the data is coming from. I needed **FHIR Data** with some sort of **plain text** which could be vectorized for Vector Search. Here I had two problems: 

1. Real Patient data isn't easy to come across. 
    - **Solution** - use synthetically generated patient data with Synthea
2. Plain text resources are generally clinical notes in Document Reference FHIR resources.
    - **Solution** - Use GenAI to write my own clinical notes and load them into FHIR Resource bundles

Coming up with a source of plain text clinical data suitable for vectorization was my first major stumbling point, as I struggled to find anything worthwhile. The inspiration of using clinical notes to create a patient chatbot did not appear from nowhere. Instead, I saw a similar demonstration by @Simon Sha in the 2025 Demo Games. This was a great demo, so I wanted to create something similar to use for a fully guided tutorial!


Simplifying FHIR server set-up

The first step of the tutorial was running an instance of IRIS for Health with a FHIR server, ideally with data pre-loaded. For this, I decided to use an Open Exchange template. If you are lost at where to start on a project, the Open Exchange is often a great place to have a look! 

I found two FHIR templates, [iris-fhir-template](https://openexchange.intersystems.com/package/iris-fhir-template) by @Evgeny, and  [Dockerfhir](https://github.com/pjamiesointersystems/Dockerfhir) by @Patrick Jamieson. Both of these templates are excellent, and in my final version of the hackathon kit, I ended up using a combination of them. If I was starting over, I would recommend the [iris-fhir-template](https://openexchange.intersystems.com/package/iris-fhir-template)  because this has a built in user interface and swagger-UI to test the FHIR endpoints. Trying to combine the two at a later date became a nightmare because the iris-fhir-template has the FHIR server endpoint hardcoded. 

On the bright-side, the day I spent building and rebuilding docker containers made me much more confident on how a Dockerfile, module.xml and iris.script setup works. If you haven't already, I recommend breaking one of the many dev-templates available on the open exchange and learning how to rebuild or fix it. Its really useful to understand how these work when creating your own projects.  

Vector Search

In my eyes, the remarkable thing about vector search is how easy it is to set-up and perform, particularly in IRIS. Sure, there's refinement that can be done later, like using a hybrid vector/keyword search or adding some sort of re-ranking system, but the basic steps of: 

- Importing a model
- Creating Vectors from plain text
- Inserting vectors into a table in IRIS
- Converting a query to a vector
- Querying the database with the query vector

Can all be performed in ~50 lines of Python code. 

This makes it a great place for newcomers to IRIS to start developing, which is why it was chosen for this hackathon kit. 

Prompting with Ollama

I've always liked the idea of prompting local models, knowing that it will always be free, doesn't need any API key set-up, and doesn't involving sending your data elsewhere. This last point can be particularly important with medical records, when its important to keep data private, and restrict third-party access. In the past, I used models with Hugging Faces Transformer module, and the results were incredibly slow, and incredibly poor. 

For this project I tried Ollama, which was a great improvement on Hugging Faces. Models that 'weigh' less than a Gigabyte, like gemma-1b give surprisingly coherent, and even accurate responses. The speed of response (at least on my computer) can be quite slow, particularly for large context windows, but if you are patient (or like taking constant tea-breaks while waiting for a model response), they perform quite well! 

I enjoyed putting together the Ollama prompting section, even if at a real hackathon, all the competitors just did the sensible thing and used the OpenAI API...

Real-life use

We shared this tutorial with teams at the Hackjak Brno Healthcare hackathon in November 2025 and received good feedback. 11 (out of 25) teams used aspects of the kit in their final solutions, 

The solutions built by hackathon teams were impressive and inspirational, with use cases ranging from using IRIS vector search in a RAG pipeline, to creating tools to fill out medical forms which connect directly to a FHIR server back-end. One of the teams (VIPIK) even uploaded their solution to [Open Exchange](https://openexchange.intersystems.com/package/VIPIK), which was really nice to see. 

Conclusions

This demo was really fun to build and I'm really glad it proved useful at the hackathon in Czech Republic. I hope it will be used more in future, as its a nice entrypoint to using FHIR data with IRIS, Python and Vector Search!

Thanks for reading, and check out the full tutorial on Open Exchange! 

Acknowledgements

Thanks to @Ruby Howard, @Thomas Dyar , @Daniel Kutac and @Ondřej Hoferek for working through the tutorial and providing feedback and @Simon Sha for the original inspiration with your entry to the Demo Games last year. 

Discussion (0)1
Log in or sign up to continue
Article
· 19 hr ago 2m read

Reviews on Open Exchange - #62

If one of your packages on OEX receives a review, you get notified by OEX only of YOUR own package.   
The rating reflects the experience of the reviewer with the status found at the time of review.   
It is kind of a snapshot and might have changed meanwhile.   
Reviews by other members of the community are marked by * in the last column.

I also placed a bunch of Pull Requests on GitHub when I found a problem I could fix.    
Some were accepted and merged, and some were just ignored.     
So if you made a major change and expect a changed review, just let me know.
 

# Package Review Stars IPM Docker *
1 JSON2Persistent Now also available in IPM 6.0 y y  
2 one-to-many-case The first of 2026 5.0 y y  
3 IRIS_dockerization promising composition 4.4   y  
4 GlobalsDB-NodeJS-Admin Historic artefact 3.8      
5 iris-jsonschema just partial working 3.8      
6 GlobalsDB-Admin-NodeJS Historic artefact #2 3.5      
7 Pivot Partner product promotion 3.4      
8 DbVisualizer good product description 3.0      
9 PIQXL Gateway Good looking product promotion 2.7      
10 Symedical Partner promotion 2.4      
11 Fhirgure a lot of JS 1.4      
12 iknowAV Another artefact 1.2      
13 OMNI-Lab link to integrator 1.2      


NOTE:
If some review is not readable for you, it might still wait for approval by OEX admins.

Discussion (0)1
Log in or sign up to continue