The duplicated messages are worrisome. It will cost much if the user needs non-repeating messages.
In most cases, the user need store the consumer records to judge a message is replicated or not, and the store stage should guarantee strong consistency. As you see, it's very complicated, so support a strict and non-redundant message delivery mechanism is impending.
In this context, we hope to design a delivery once plugin, say, you could design a global(but need raft guarantee multi-copy data) storage, using the hooker of RocketMQ ConsumeMessageHook to finish the task.