Thank you @Niall.
So in your suggested flow, if I understand correctly, we are creating 2 distinct process instances, depending on which message is received first through kafka.
If we take the top flow and assume that we have received ‘message one’ from a listener first:

The kafka listener will start the process instance by calling the following (and we can provide a trace ID as the business key as you suggested):
runtimeService.startProcessInstanceByMessage("Message_Topic_1_Received", tracer.currentSpan().context().traceIdString());
Following this, another kafka listener gets message 2 - it also calls something similar to start the process flow, because it doesn’t know if it should start a new process instance, or continue an existing process instance:
runtimeService.startProcessInstanceByMessage("Message_Topic_2_Received", tracer.currentSpan().context().traceIdString());
Programatically, how should I handle this to ensure it either continues with the existing flow, or starts a new process instance? How do I correlate the business keys together?
Thanks.