Skip to main content
Version: 3.0

Delivery promises

When a connection fails, MaestroHub keeps a buffered write and sends it once the destination answers again (store and forward), so the outage itself does not lose it. A write gets one of three promises. The promise depends on what the destination can do.

PromiseWhat it means
Effectively onceThe destination drops a repeat of the same write: it lands on the same row, object or document, or the destination recognises the write key. One effect per write, within the destination's window.
At least onceA write can arrive one extra time. This happens only for a write that was on its way when an outage, a crash, a restart or a replica move happened. It is never one extra copy per retry or per minute of outage. Every copy carries the same write key, so the receiver can drop the repeat.
At most onceThe write is never buffered (UDP). Delivery cannot be confirmed.

Sent, not confirmed. Some destinations give no acknowledgement at all: raw TCP, and syslog over TLS or TCP. Their writes are buffered while the destination can't be reached, so an outage does not lose them, and they keep the at least once promise for what MaestroHub controls. But once the network has taken a write, nothing tells MaestroHub that the receiver got it. Such a write ends as sent, not confirmed: it is never sent again, never counted as delivered, and one taken just before the receiver fails may be lost. Outage reports, the Overview and notifications count these writes on their own. Where every write must be confirmed, use a destination that acknowledges it (MQTT, Kafka, REST, a database).

Where you see it: in the Pipeline Designer, a write node shows its promise at the top of its Delivery tab: the promise in two words, what a copy carries, and a link to this page. A write its connection cannot buffer (UDP, or syslog over UDP) shows At most once there, with the reason and what to use instead, in place of the delivery choices. A node that only reads shows no promise.

How a receiver drops a repeat (idempotent receiver)​

Every buffered write has a write key. The key is the same on the first attempt, on every resend and on a replay from Failed messages. The table below says where each connector puts it. Examples:

  • a Kafka or NATS header maestrohub.write-key
  • an AMQP or RabbitMQ message-id
  • an MQTT 5 user property
  • a Pub/Sub attribute

A consumer that must see each write once keeps the keys it has processed for longer than an outage can last. When a key comes again, it skips the message. A database sink gets the same effect from a unique column on the key.

Skipping or moving a write that is still on its way (Failed messages, a purge) also stops the request it went out in. When several writes went out in one request (a batch, for example to InfluxDB), the others in that request can each arrive one extra time too, when they are sent again.

A repeat appears only in the cases above, so a short memory is enough. A few hours of keys covers a day-long outage, because the copy arrives right after the connection comes back.

Per connector​

The table is generated from each connector's declaration. A test fails when it is out of date.

ConnectorOperationPromiseDestination drops a repeatWrite key on every copyNote
Amazon Data FirehosePut Record (firehose.put_record)At least onceNo: a repeat is a second copyNone: a record is the pipeline's bytes and Firehose has no id, attribute or header the sender sets
Amazon Data FirehosePut Record Batch (firehose.put_record_batch)At least onceNo: a repeat is a second copyNone: a record is the pipeline's bytes and Firehose has no id, attribute or header the sender sets
Amazon DynamoDBDelete Item (dynamodb.deleteItem)Effectively onceYes: the same target (no window)None: a delete removes the item: nothing remains to carry a key
Amazon DynamoDBPut Item (dynamodb.putItem)Effectively onceYes: the same target (no window)item attribute maestrohub.write-key (unless the item sets it); a conditional put a replay fails on an item with the write's own key is delivered
Amazon DynamoDBUpdate Item (dynamodb.updateItem)Effectively onceYes: by the write key, unless the function writes maestrohub.write-key itself or uses the placeholders #maestrohubWriteKey/:maestrohubWriteKey; window: until the item's next write with another keyitem attribute maestrohub.write-key, set by the update, which applies only when the item does not carry the key yet
Amazon EventBridgePut Event (eventbridge.put_events)At least onceNo: a repeat is a second copyNone: an event's Detail, Source and Resources are the pipeline's, and EventBridge has no attribute or id the sender sets
Amazon KinesisPut Record (kinesis.put)At least onceNo: a repeat is a second copypartition key, when the function sets none (Kinesis drops no repeat; a consumer can by it)
Amazon KinesisPut Records (kinesis.put_batch)At least onceNo: a repeat is a second copypartition key "<key>#<i>" of record i that sets none (Kinesis drops no repeat; a consumer can by it)
Amazon RedshiftCopy From S3 (redshift.copy_from_s3)At least onceNo: a repeat is a second copyNone: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds
Amazon RedshiftWrite (redshift.write)At least onceNo: a repeat is a second copyNone: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds
Amazon S3Put Object (s3.write.object)Effectively onceYes: the same target, with a fixed object key; with overwriteExisting off a replay finds its own object (by its write key) or goes to name_<key digest> again (no window)object metadata maestrohub-write-key (x-amz-meta-maestrohub-write-key), unless the function's metadata sets it
Amazon SNSPublish (sns.publish)Effectively onceYes: by the write key, on a FIFO topic, when the function sets no messageDeduplicationId; window: 5mmessage attribute maestrohub.write-key (when the function leaves room: SNS allows 10); MessageDeduplicationId on a FIFO topic
Amazon SQSDelete Message (sqs.delete)Effectively onceYes: the same target (no window)None: a delete names its receipt handle
Amazon SQSSend Message (sqs.send)Effectively onceYes: by the write key, on a FIFO queue, when the function sets no messageDeduplicationId; window: 5mmessage attribute maestrohub.write-key (when the function leaves room: SQS allows 10); MessageDeduplicationId on a FIFO queue
Amazon TimestreamWrite Records (timestream.write)Effectively onceYes: the same target (no window)None: a record is identified by its dimensions, time and version
AMQPPublish (amqp.publish)At least onceNo: a repeat is a second copymessage-id ("<key>#<i>" for item i of a batch)
AMQPPublish Batch (amqp.publish_batch)At least onceNo: a repeat is a second copymessage-id ("<key>#<i>" for item i of a batch)
Apache CassandraDelete Rows (cassandra.delete.rows)Effectively onceYes: the same target, an INSERT is an upsert by primary key (no window)None: the primary key is the row's own; the columns are the pipeline's
Apache CassandraWrite Rows (cassandra.write.rows)Effectively onceYes: the same target, an INSERT is an upsert by primary key (no window)None: the primary key is the row's own; the columns are the pipeline's
Apache IcebergAppend to Table (iceberg.table.append)Effectively onceYes: by the write key; window: the table's snapshot history (until snapshots expire)snapshot summary property maestrohub.write-key
Apache PulsarPublish (pulsar.publish)At least onceNo: a repeat is a second copyproperty maestrohub.write-key
AWS IoT CorePublish Message (awsiot.publish)At least onceNo: a repeat is a second copyNone: an MQTT 3.1.1 PUBLISH carries only the topic and the pipeline's payload; a shadow update is the pipeline's document
AWS IoT CoreUpdate Device Shadow (awsiot.shadow.update)At least onceNo: a repeat is a second copyNone: an MQTT 3.1.1 PUBLISH carries only the topic and the pipeline's payload; a shadow update is the pipeline's document
AWS IoT GreengrassPublish Message (greengrass.publish)At least onceNo: a repeat is a second copyNone: an MQTT 3.1.1 PUBLISH carries only the topic and the pipeline's payload
AWS IoT SiteWiseWrite (sitewise.write)Effectively onceYes: the same target (no window)None: a value is identified by its asset property and timestamp
AWS LambdaInvoke Async (awslambda.invoke_async)At least onceNo: a repeat is a second copyNone: Lambda passes the client context to synchronous invocations only; an Event invocation is the pipeline's payload and has no id the sender sets
Azure Blob StorageDelete Blob (azureblob.blob.delete)Effectively onceYes: the same target (no window)None: a delete leaves no blob to carry it; deleting the same name twice leaves the same state
Azure Blob StoragePut Blob (azureblob.blob.write)Effectively onceYes: the same target, in overwrite mode (a fixed blob name) (no window)blob metadata maestrohub_write_key on a Block Blob write (unless the function sets that name); an Append or Page Blob write carries none: an append has no metadata of its own and a page write updates a fixed range
Azure Cosmos DBDelete Item (azurecosmosdb.delete.item)Effectively onceYes: the same target (no window)None: a delete leaves no item to carry it; deleting the same id twice leaves the same state
Azure Cosmos DBTransactional Batch (azurecosmosdb.execute.batch)Effectively onceYes: the same target, by the items' ids: a batch of upserts leaves the same items; a repeat refused by an item this batch already put (it carries the batch's key for it) is answered delivered, as a batch is atomic (no window)item property maestrohub.write-key <key>#<i> on the item of operation i (create, upsert, replace), unless the item sets it
Azure Cosmos DBPatch Item (azurecosmosdb.patch.item)At least onceNo: a repeat is a second copyitem property maestrohub.write-key, set by the patch while it has room (Cosmos DB takes 10 patch operations; the function's own come first)
Azure Cosmos DBWrite Item (azurecosmosdb.write.item)Effectively onceYes: the same target, by the item's id: an upsert or replace leaves the same item; a create or an ETag-conditioned write that meets the item this write already put (it carries the write's key) is answered delivered (no window)item property maestrohub.write-key (unless the item sets it)
Azure Event HubsSend Event (azureeventhubs.send)At least onceNo: a repeat is a second copyevent application property maestrohub.write-key (unless the function sets it)
Azure Event HubsSend Batch (azureeventhubs.send_batch)At least onceNo: a repeat is a second copyevent application property maestrohub.write-key "<key>#<i>" on event i
Azure IoT EdgeSend to Output (azureiotedge.output.send)At least onceNo: a repeat is a second copymessage id
Azure IoT EdgeReport Module Twin Properties (azureiotedge.twin.report)Effectively onceYes: the same target (no window)None: a reported-properties patch has no message id; the last patch wins
Azure IoT HubSend D2C Telemetry (azureiothub.d2c.send)At least onceNo: a repeat is a second copymessage id ($.mid), unless the function sets a $.mid message property
Azure IoT HubUpdate Reported Properties (azureiothub.twin.report)Effectively onceYes: the same target (no window)None: a reported-properties patch has no message id; the last patch wins
Azure Service BusSend Message (azureservicebus.send)Effectively onceYes: by the write key, the queue or topic has duplicate detection enabled; window: the entity's duplicate-detection window (10 min by default, up to 7 days)MessageId, when the function sets none
Azure Service BusSend Batch (azureservicebus.send.batch)Effectively onceYes: by the write key, the queue or topic has duplicate detection enabled; window: the entity's duplicate-detection window (10 min by default, up to 7 days)MessageId "<key>#<i>" for message i, when the function sets none
Azure Synapse AnalyticsCopy Into (azuresynapse.copy.into)At least onceNo: a repeat is a second copyNone: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds
Azure Synapse AnalyticsWrite (azuresynapse.write)At least onceNo: a repeat is a second copyNone: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds
ClickHouseWrite (clickhouse.write)Effectively onceYes: by the write key, on a table that deduplicates inserts (Replicated*/Shared MergeTree, or a MergeTree with non_replicated_deduplication_window > 0, which is 0, off, by default) with insert_deduplicate on (the default); window: the table's deduplication window: the last replicated_deduplication_window inserts (1000) and replicated_deduplication_window_seconds (7 days) on Replicated*/Shared MergeTree by default; the last non_replicated_deduplication_window inserts on a plain MergeTreeeach INSERT's insert_deduplication_token (<key>#<i> per batch when the write has several); a setting kept in the table's deduplication log, not a column
CouchbaseRemove Document (couchbase.remove)Effectively onceYes: the same target (no window)None: the document id is the write's own key
CouchbaseUpsert Document (couchbase.upsert)Effectively onceYes: the same target (no window)None: the document id is the write's own key
Databricks StorageWrite File (databricks_storage.write)Effectively onceYes: the same target, with overwrite (a fixed path) (no window)None: a file is the pipeline's bytes under the config's name; there is no field beside them
DiscordSend Message (discord.sendMessage)Effectively onceYes: by the write key, on a bot connection (Execute Webhook takes no nonce); window: a few minutes (Discord's enforce_nonce window)nonce (the first 25 hex digits of the key's SHA-256) with enforce_nonce, on a bot connection; a webhook message carries none
ElasticsearchDelete (elasticsearch.delete)Effectively onceYes: the same target (no window)None: a delete names its document id; a repeat deletes nothing more
ElasticsearchIndex (elasticsearch.index)Effectively onceYes: by the write key, when the function sets no documentId (the write key is the _id, created with op_type=create); a documentId of the function's own makes a repeat an overwrite of the same document (no window)the document _id (op_type=create) when the function sets no documentId
FTP / SFTPDelete (ftp.delete)Effectively onceYes: the same target, in overwrite mode (a fixed name) (no window)None: a file is the pipeline's bytes under the config's name; there is no field beside them
FTP / SFTPRename (ftp.rename)Effectively onceYes: the same target, in overwrite mode (a fixed name) (no window)None: a file is the pipeline's bytes under the config's name; there is no field beside them
FTP / SFTPUpload (ftp.upload)Effectively onceYes: the same target, in overwrite mode (a fixed name) (no window)None: a file is the pipeline's bytes under the config's name; there is no field beside them
GitLabAdd Comment (gitlab.addComment)At least onceNo: a repeat is a second copyNone: GitLab's API takes no idempotency key
GitLabCreate Issue (gitlab.createIssue)At least onceNo: a repeat is a second copyNone: GitLab's API takes no idempotency key
GitLabUpdate Issue (gitlab.updateIssue)Effectively onceYes: the same target (no window)None: GitLab's API takes no idempotency key
Google Cloud BigtableDelete Row (bigtable.deleteRow)Effectively onceYes: the same target, the row key and the produce-time cell timestamp (no window)None: a cell holds the pipeline's columns; row key and produce timestamp already identify the write
Google Cloud BigtableWrite Row (bigtable.writeRow)Effectively onceYes: the same target, the row key and the produce-time cell timestamp (no window)None: a cell holds the pipeline's columns; row key and produce timestamp already identify the write
Google Cloud BigtableWrite Rows (bigtable.writeRows)Effectively onceYes: the same target, the row key and the produce-time cell timestamp (no window)None: a cell holds the pipeline's columns; row key and produce timestamp already identify the write
Google Cloud FirestoreDelete Document (firestore.deleteDocument)Effectively onceYes: the same target (no window)None: a delete names its document
Google Cloud FirestoreSet Document (firestore.setDocument)Effectively onceYes: by the write key, when the function sets no documentId: the write key names the document, created, and a repeat that finds it is answered delivered (with a documentId the write overwrites its own document) (no window)the document id, when the function sets no documentId
Google Cloud FirestoreUpdate Document (firestore.updateDocument)Effectively onceYes: the same target (no window)None: an update names its document; the fields are the pipeline's
Google Cloud StorageCompose Objects (gcs.compose.objects)Effectively onceYes: the same target, a compose names its destination object, so a repeat overwrites it (no window)destination object custom metadata maestrohub.write-key
Google Cloud StorageDelete Object (gcs.delete.object)Effectively onceYes: the same target, a delete names its object (no window)None: a delete removes the object; nothing is left to carry a key
Google Cloud StoragePut Object (gcs.put.object)Effectively onceYes: the same target, a put names its object, so a repeat overwrites it; with overwriteExisting off, a repeat finds its own write key on the object and is answered delivered (no window)object custom metadata maestrohub.write-key (unless the function sets that name itself)
Google Pub/SubPublish (googlepubsub.publish)At least onceNo: a repeat is a second copyattribute maestrohub.write-key
Google SheetsAppend Rows (googlesheets.appendRows)At least onceNo: a repeat is a second copyNone: a row is the pipeline's cells
Google SheetsUpdate Range (googlesheets.updateRange)Effectively onceYes: the same target (no window)None: a row is the pipeline's cells
GrafanaCreate Annotation (grafana.createAnnotation)At least onceNo: a repeat is a second copyNone: an annotation takes no id the sender sets
GraphQLMutation (graphql.mutation)At least onceNo: a repeat is a second copyheader Idempotency-Key (with Send Idempotency-Key on; a key set in the connection's Headers wins)
InfluxDBWrite (influxdb.write)Effectively onceYes: the same target (no window)None: a point is identified by its series and its produce timestamp: a repeat is the same point
KafkaProduce (kafka.produce)At least onceNo: a repeat is a second copyheader maestrohub.write-key
Local FileWrite File (localfile.write.local)Effectively onceYes: the same target, not in append mode: a repeat replaces its own copy, finds its bytes under the name, or lands on the variant named by its write key (no window)None: a file is the pipeline's bytes under the config's name; there is no field beside them
MattermostSend Message (mattermost.sendMessage)At least onceNo: a repeat is a second copypost property maestrohub.write-key (props; create-post and the incoming webhook take no idempotency key: every copy is posted)
Microsoft Fabric OneLakeWrite File (onelake.path.put)Effectively onceYes: the same target, a fixed path (no window)None: a file is the pipeline's bytes under the config's name; the Data Lake create takes no metadata, and setting it would be a second request after the upload, so a cut between the two would leave a copy without its key
Microsoft Fabric OneLakeAppend to Table (onelake.table.append)Effectively onceYes: by the write key; window: the table's transaction logDelta transaction appId
Microsoft SQL ServerWrite (mssql.write)Effectively onceYes: by the write key, with writeKeyColumn set on a column with a unique index (no window)the writeKeyColumn column, <key>#<row>
Microsoft TeamsSend Message to Channel (msteams.sendMessageToChannel)At least onceNo: a repeat is a second copyNone: Graph's channel-message create takes no idempotency key
MongoDBDelete One (mongodb.deleteOne)Effectively onceYes: the same target (no window)None: a delete names its document by filter
MongoDBInsert One (mongodb.insertOne)Effectively onceYes: by the write key, when the document has no _id of its own (the write key becomes its _id) (no window)_id, when the document has none
MongoDBUpdate One (mongodb.updateOne)Effectively onceYes: the same target, a $set update by filter (no window)None: an update names its document by filter; its fields are the pipeline's
MQTTPublish (mqtt.publish)At least onceNo: a repeat is a second copyMQTT 5 user property maestrohub.write-key (MQTT 3.1.1 has no field for it)
MySQLWrite (mysql.write)Effectively onceYes: by the write key, with writeKeyColumn set on a column with a unique index (no window)the writeKeyColumn column, <key>#<row>
NATSPublish (nats.publish)Effectively onceYes: by the write key, with useJetStream; window: the stream's Duplicates window (2 min by default)header maestrohub.write-key; JetStream also Nats-Msg-Id
ODBCWrite (odbc.write)At least onceNo: a repeat is a second copyNone: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds
Oracle DatabaseWrite (oracle.write)Effectively onceYes: by the write key, with writeKeyColumn set on a column with a unique index (no window)the writeKeyColumn column, <key>#<row>
PagerDutySend Change Event (pagerduty.sendChangeEvent)At least onceNo: a repeat is a second copypayload.custom_details maestrohub.write-key (a change event has no dedup key: PagerDuty records every copy; the function's own value under that name wins)
PagerDutySend Event (pagerduty.sendEvent)Effectively onceYes: by the write key; window: while the alert is opendedup_key, when the function sets none
PostgreSQLVector Upsert (postgres.vectorUpsert)Effectively onceYes: the same target, an upsert by id (no window)None: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds
PostgreSQLWrite (postgres.write)Effectively onceYes: by the write key, with writeKeyColumn set on a column with a unique index (no window)the writeKeyColumn column, <key>#<row>
PrometheusWrite Samples (prometheus.write_samples)Effectively onceYes: the same target (no window)None: a point is identified by its series and its produce timestamp: a repeat is the same point
QuestDBWrite (questdb.write)At least onceNo: a repeat is a second copyNone: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds
RabbitMQPublish (rabbitmq.publish)At least onceNo: a repeat is a second copymessage-id
RedisPublish (redis.publish)At least onceNo: a repeat is a second copyNone: a PUBLISH is a channel and the pipeline's message
REST APIPATCH Request (rest.patch)At least onceNo: a repeat is a second copyheader Idempotency-Key (with Send Idempotency-Key on; the function's own Idempotency-Key header wins)
REST APIPOST Request (rest.post)At least onceNo: a repeat is a second copyheader Idempotency-Key (with Send Idempotency-Key on; the function's own Idempotency-Key header wins)
REST APIPUT Request (rest.put)Effectively onceYes: the same target (no window)header Idempotency-Key (with Send Idempotency-Key on; the function's own Idempotency-Key header wins)
SAP HANAWrite (sap_hana.write)Effectively onceYes: by the write key, with writeKeyColumn set on a column with a unique index (no window)the writeKeyColumn column, <key>#<row>
SAP IDocSend IDoc (sap_idoc.send)Effectively onceYes: by the write key, a structured send whose function leaves DOCNUM blank (a raw send keeps its own DOCNUM); window: unlimited (SAP's duplicate check on the sender IDoc number)EDI_DC40/DOCNUM: 16 digits derived from the key's SHA-256; SAP's 'already received' answer to a repeat is delivered
SAP IDocSend IDoc Batch (sap_idoc.send_batch)Effectively onceYes: by the write key, IDocs whose function leaves DOCNUM blank; window: unlimited (SAP's duplicate check on the sender IDoc number)EDI_DC40/DOCNUM of each IDoc, derived from <key>#<i> (i = the IDoc's position in the packet; one IDoc: the key); SAP refuses a repeated packet as already received (409, reported refused: the packet may have landed in part)
ServiceNowCreate Record (servicenow.createRecord)At least onceNo: a repeat is a second copyNone: the Table API's create takes no idempotency key
ServiceNowUpdate Record (servicenow.updateRecord)Effectively onceYes: the same target (no window)None: the Table API's create takes no idempotency key
SlackSend Message (slack.sendMessage)At least onceNo: a repeat is a second copymessage metadata: event type maestrohub_write, payload maestrohub.write-key, with a bot token (xoxb-; chat.postMessage takes no idempotency key: Slack posts every copy)
SMB ShareWrite File (smb.write.file)Effectively onceYes: the same target, not in append mode: a repeat replaces its own copy, finds its bytes under the name, or lands on the variant named by its write key (no window)None: a file is the pipeline's bytes under the config's name; there is no field beside them
SMTPSend Email (smtp.send)At least onceNo: a repeat is a second copyMessage-ID header, derived from the write key
SnowflakeWrite (snowflake.write)At least onceNo: a repeat is a second copyNone: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds
Snowflake StreamingStream Rows (snowflake_streaming.append_rows)Effectively onceYes: by the write key; window: the channel's committed offset tokenchannel offset token
SOAPInvoke Operation (soap.invoke)At least onceNo: a repeat is a second copyNone: a SOAP body is the pipeline's envelope
Sparkplug BPublish Device Data (sparkplugb.ddata)At least onceNo: a repeat is a second copyNone: a Sparkplug B payload carries only the spec's fields (timestamp, seq, metrics)
SplunkSend Events (splunk.send)At least onceNo: a repeat is a second copyindexed field maestrohub.write-key (the key for one event, <key>#<i> for event i of an array; HEC has no dedupe: every copy is indexed; the function's own field of that name wins)
SyslogSend Message (syslog.send)At least onceNo: a repeat is a second copyNone: RFC 5424 structured data needs an IANA enterprise number MaestroHub does not hold; RFC 3164 has no fieldOver TLS or TCP: buffered while the collector can't be reached. A message the network accepted is counted sent, not confirmed: syslog has no acknowledgement, so one handed over just before the collector fails may be lost. Over UDP (the default transport): never buffered, at most once: messages sent while the collector is down are lost.
TCPRequest (tcp.request)At least onceNo: a repeat is a second copyNone: a raw TCP stream is the pipeline's bytes and framingBuffered while the receiver can't be reached. A message the network accepted is counted sent, not confirmed: raw TCP has no acknowledgement, so one handed over just before the receiver fails may be lost. Where each write must be confirmed, use a connector whose destination acknowledges it (MQTT, Kafka, REST).
TCPSend (tcp.send)At least onceNo: a repeat is a second copyNone: a raw TCP stream is the pipeline's bytes and framingBuffered while the receiver can't be reached. A message the network accepted is counted sent, not confirmed: raw TCP has no acknowledgement, so one handed over just before the receiver fails may be lost. Where each write must be confirmed, use a connector whose destination acknowledges it (MQTT, Kafka, REST).
TwilioMake Call (twilio.makeCall)At least onceNo: a repeat is a second copyNone: Twilio's Messages and Calls APIs take no idempotency key
TwilioSend Message (twilio.sendMessage)At least onceNo: a repeat is a second copyNone: Twilio's Messages and Calls APIs take no idempotency key
UDPRequest (udp.request)At most once (not buffered)Not applicableNone: a datagram is the pipeline's bytesFire-and-forget: delivery can't be confirmed and messages sent while the receiver is down are lost.
UDPSend (udp.send)At most once (not buffered)Not applicableNone: a datagram is the pipeline's bytesFire-and-forget: delivery can't be confirmed and messages sent while the receiver is down are lost.