# Recommended RPC architecture for Igntion 8.3 modules with multiple providers

**URL:** <https://forum.inductiveautomation.com/t/recommended-rpc-architecture-for-igntion-8-3-modules-with-multiple-providers/113438>\
**Category:** Module Development\
**Created:** [January 21, 2026, 7:40am UTC](https://forum.inductiveautomation.com/t/recommended-rpc-architecture-for-igntion-8-3-modules-with-multiple-providers/113438 "2026-01-21T07:40:37Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![manuele.longhi](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/manuele.longhi/32/51470_2.png) [@manuele.longhi](https://forum.inductiveautomation.com/u/manuele.longhi)\
**Post date:** [January 21, 2026, 7:40am UTC](https://forum.inductiveautomation.com/t/recommended-rpc-architecture-for-igntion-8-3-modules-with-multiple-providers/113438/1 "2026-01-21T07:40:37Z")

</div>

Hello all,

I am currently in the process of migrating an Ignition module from version 8.1 to 8.3 and I've run into an existing architectural pattern that I need to either validate or refactor.

Currently, the module defines multiple Providers are defined (each with their own implementation), each of which is instantiated by the GatewayHook, Each of these Provider is then passed to a single, **static** `RPCHandler`. This handler acts as a proxy, duplicating every method from every provider to expose them via RPC.

Crucially, some providers are accessing this static `RPCHandler` instance to call methods that are implemented on _other_ providers.

Is this architecture recommended for Ignition 8.3, or should I refactor this?

I have already started refactoring marking each of the Provider with the `@RpcInterface` tag, as well as implementing the `getRpcImplementation()` in the `GatewayHook`, returning

```java
GatewayRpcImplementation.of(ProtoRpcSerializer.DEFAULT_INSTANCE,
    implementedProvider1,
    implementedProvider2,
    implementedProvider3,
    …
);

```

so I figure the old RPCHandler shouldn't be needed, am I correct? In that case, is there a way keep the submodules communicating?

Thanks

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [January 21, 2026, 5:33pm UTC](https://forum.inductiveautomation.com/t/recommended-rpc-architecture-for-igntion-8-3-modules-with-multiple-providers/113438/2 "2026-01-21T17:33:18Z")

</div>

First, here's my introduction writeup on the new RPC system:

> [@ModuleRPCFactory to ProtoBuf](https://forum.inductiveautomation.com/t/modulerpcfactory-to-protobuf/109936/5):
>
> I'll reproduce the full 'dev introduction' document here - I wrote the thing, and there's nothing sensitive here. It'll eventually end up in the SDK docs, but no idea when. This is more general context about the whole thing and the technical details than purely a migration guide from 8.1 -\> 8.3. The closest thing to a 'tl;dr' is the last ~third of part 2. play_button Part 1

That may help enough on its own.  
I'll also mention that the new RPC system is (deliberately) a lot more flexible and less dogmatic. Both the 'routing' layer and the 'serialization' layer are completely within your power to override and provide your own solution. `RpcInterface`, `RpcDelegate`, and the annotation based model are provided for convenience (and are what we use internally) but you don't _have_ to use them if they don't fit your model. Ditto `ProtoRpcSerializer`; if you want to keep using Java serialization for your module we won't (can't) stop you.

The only underlying requirement (if you want to use our RPC system) is that your gateway hook returns a [`GatewayRpcImplementation`](https://files.inductiveautomation.com/sdk/javadoc/ignition83/8.3.0/com/inductiveautomation/ignition/gateway/rpc/GatewayRpcImplementation.html). That interface contains [`RpcRouter`](https://files.inductiveautomation.com/sdk/javadoc/ignition83/8.3.0/com/inductiveautomation/ignition/gateway/rpc/RpcRouter.html), which you can choose to implement using whatever logic you want based on the incoming `RpcCall` triple (module ID will be static, but the package ID and function name can be used to disambiguate however you want). You just have to implement the routing function and return an [`RpcHandler`](https://files.inductiveautomation.com/sdk/javadoc/ignition83/8.3.0/com/inductiveautomation/ignition/gateway/rpc/RpcHandler.html), which is a relatively straightforward functional interface.

---

<div class="post-metadata">

**Author:** ![manuele.longhi](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/manuele.longhi/32/51470_2.png) [@manuele.longhi](https://forum.inductiveautomation.com/u/manuele.longhi)\
**Post date:** [January 22, 2026, 8:02am UTC](https://forum.inductiveautomation.com/t/recommended-rpc-architecture-for-igntion-8-3-modules-with-multiple-providers/113438/3 "2026-01-22T08:02:30Z")

</div>

Thanks Paul! Very helpful (as always) 🙂

I missed that post on the forum, thanks for linking it
