17. Command Acknowledgment¶
AMPS command processing is designed to be asynchronous. The design of the server makes it possible for an application to send a command to AMPS, and receive the results of that command at a later time. Acknowledgment of commands is always optional: the server makes no requirement that an application request acknowledgment. The AMPS client libraries automatically request the acknowledgments required to maintain the guarantees the client API provides.
The status and results of a command are returned to a client in the form
of an acknowledgment, or ack
, message. AMPS can return status
updates at various checkpoints throughout the command processing
sequence.
For many applications, it may not be necessary for the application to request message acknowledgments explicitly. The AMPS clients request a set of acknowledgments by default that balance performance with error detection.
AMPS supports a variety of ack
types, and allows you to request
multiple ack types on each command. For example, the received ack type
requests that AMPS acknowledge when the command is received, while the
completed ack type requests that AMPS acknowledge when it has completed
the command (or the portion of the command that runs immediately). Each
AMPS command supports a different set of types, and the precise meaning
of the ack
returned depends on the command that AMPS is
acknowledging.
AMPS commands are inherently asynchronous, and AMPS does not provide acknowledgment messages by default. A client must both explicitly request an acknowledgment and then receive and process that acknowledgment to know the results of a command. It is normal for time to elapse between the request and the acknowledgment, and so AMPS acknowledgments provide ways to correlate the acknowledgment with the command that produced it. This is typically done with an identifier that the client assigns to a command, which is then returned in the acknowledgment for the command.
AMPS supports the acknowledgment types listed in the following table:
Acknowledgment Type | General Description |
---|---|
completed |
The command (or a portion of the command) has completed. |
persisted |
The results of the command have been persisted to durable storage. |
processed |
AMPS has processed the command. |
received |
AMPS has received the command. |
stats |
AMPS returns statistics associated with the command. |
Table 17.1: AMPS acknowledgment messages
Acknowledgments for different commands may not arrive in the order that
commands were submitted to AMPS. For example, a publish
command to a
topic that uses synchronous replication will not return a persisted
acknowledgment until the synchronous replication destinations have
persisted the message. If the client issues a subscribe
command in
the meantime, the processed
acknowledgment for the subscribe
command – indicating that AMPS has processed the subscription request
– may well return before the persisted
acknowledgment.
Not all commands support all acknowledgment types, and the meaning of each acknowledgment may differ depending on the command submitted. The acknowledgements for different commands set different fields on an acknowledgement message. See the AMPS Command Reference for details.
Acknowledgments for different commands may not arrive in the order that
Requesting Acknowledgments¶
Acknowledgments from the AMPS server are always optional. The AMPS clients will request acknowledgments as necessary for processing and error reporting. In addition, an application can request acknowledgments as necessary to meet the requirements of an application.
The AMPS Command Guide contains information on the acknowledgment types available for each command and the meaning of those acknowledgments.
Receiving Acknowledgments¶
Acknowledgments for a specific command or subscription are delivered as a part of the message stream for that command. In an AMPS client, this means that whatever method an application is using to receive responses from AMPS will include acknowledgment messages.
Acknowledgments from AMPS have a command type of ack
. This command type
is reserved for responses from AMPS to a client. The CommandId
of the
acknowledgment message contains the CommandId
provided by the client
on the command that AMPS is responding to. The client uses this CommandId
to route the acknowledgment message to the correct message processor in
the application.
Notice that when acknowledgments are conflated – that is, the acknowledgment refers to a number of publish commands – AMPS does not include a command ID in the acknowledgment message. Further details are provided at Acknowledgment Conflation and Publish Acknowledgments.
Bookmark Subscriptions and Completed Acknowledgments¶
When AMPS is processing a bookmark subscription, a completed
acknowledgment indicates that the subscription has completed replay from the
transaction log. This means that the subscription has reached the point in
the transaction log at which the subscribe command was received, and
messages delivered on the subscription after the completed
acknowledgment
are from new publishes.
Bookmark Subscriptions and Persisted Acknowledgments¶
A bookmark subscription typically also requests the persisted
acknowledgement (the AMPS clients do this automatically). In this case,
AMPS periodically returns an acknowledgement that includes the last
bookmark written to the local transaction log. This information helps
with application recovery, particularly in cases where publishers are
intermittent or low-volume, and the last message for a subscription is
significantly older than the last message evaluated for delivery to
the subscription.
Acknowledgment Conflation and Publish Acknowledgments¶
For some commands, AMPS will conflate acknowledgments and return acknowledgments for multiple commands at one time. When AMPS conflates acknowledgments, AMPS provides an identifier other than the command identifier that describes which commands the acknowledgment applies to.
For example, when a transaction log is configured, AMPS conflates
persisted
acknowledgments in response to publish
commands
and sow_delete
commands. These conflated
acknowledgments contain the last client sequence number that the
acknowledgment applies to rather than the command identifiers or
sequence numbers for all messages being acknowledged. For example, if an
application publishes messages with sequence numbers 1
, 2
,
3
, 4
, and 5
, and message 3
fails due to entitlement
restrictions, AMPS will return an ack
indicating success for message
2
, an ack
indicating failure for message 3
, and an ack
indicating success for message 5
.
By default, AMPS produces conflated acknowledgments for a given connection approximately once a second.
Starting with version 5.2.3.0, AMPS allows configuration of the conflation interval.
- To set a different conflation interval
for an individual client, provide an
ack_conflation
option in the options string for the logon for that client. This sets the interval at which AMPS will provide acknowledgements to that client. - To set a different conflation interval for replication acknowledgements,
specify the
AckConflationInterval
in the replicationDestination
. This sets the interval at which the downstream AMPS server will provide acknowledgements to this AMPS server.
Notice that when a publisher is publishing to a replicated topic, the
ack_conflation
interval sets the interval at which AMPS acknowledges
messages that have already been acknowledged by synchronous replication
destinations, while the AckConflationInterval
specifies how often
those downstream destinations produce an acknowledgement. In a situation
where it is important to reduce the default latency of an acknowledgement,
both the server option and the client side option typically need to be set.
To see more information about the different commands and their supported acknowledgment types, please refer to the AMPS Command Reference, provided with 4.0 and greater versions of the AMPS clients and available on the 60East web site.