Hi all,

I would like to create a PIP for issue #2664 on Github. The details of the
PIP are below.
I hope we could discuss this thoroughly.

Cheers,
Richard

PIP-31: Add support for transactional messaging

Motivation: Pulsar currently could improve upon their system of sending
packets of data by implementing transactional messaging. This system
enforces eventual consistency within the system, and allows operations to
be performed atomically.

Proposal:

As described in the issue, we would implement the following policy in
Producer and Pulsar Broker:
1. The producer produces the pre-processing transaction message. At this
point, the broker will set the status of this message to unknown.
2. After the local transaction is successfully executed, the commit message
is sent, otherwise the rollback message is sent.
3. The broker receives the message. If it is a commit message, it modifies
the transaction status to commit, and then sends an actual message to the
consumer queue. At this time, the consumer can consume the message.
Otherwise, the transaction status is modified to rollback. The message will
be discarded.
4. If at step 2, the producer is down or abnormal, at this time, the broker
will periodically ask the specific producer for the status of the message,
and update the status according to the producer's response, and process it
according to step 3, the action that comes down.

Specific concerns:
There are a number of things we will improve upon or add:
- A configuration called ```maxMessageUnknownTime```. Consider this
scenario: the pre-processing transaction message is sent, but the commit or
rollback message is never received, which could mean that the status of a
message would be permanently unknown. To avoid this from happening, we
would need a config which limits the amount of time the status of a message
could be unknown (i.e. ```maxMessageUnknownTime```) After that, the message
would be discarded.
- Logging would be updated to log the status of a message i.e. UNKNOWN,
ROLLBACK, or COMMITTED. This would allow the user to know whether or not a
message had failed or fallen through.

Possible Additional API:
- We would add a method which allows the user to query the state of the
message i.e. ```getStateOfMessage(long id)```

Reply via email to