public final class CdcSinks extends Object
ChangeRecord
items
as their input.
These sinks can detect any reordering that might happen in
the ChangeRecord
stream (Jet pipelines use parallel
execution, so item reordering can and does happen). Reordering
detection is based on implementation-specific sequence numbers
provided by CDC event sources. The sink reacts to reordering by
dropping obsolete input items. The exact behavior is as follows. For
each input item, the sink:
keyFn
to the input item to extract its key
About the implementation-specific sequence numbers provided by the CDC sources. They consist of two parts:
The sequence source is made up of information like ID of the database instance the connector is connected to, name of the binlog file being monitored and so on. So whenever the source reconnects to a new server or switches to a new binlog file or other such event, the source field of sequence numbers will change.
The logic of determining which event are more recent takes the sequence source into consideration. Whenever the source field changes, the event carrying it will be considered more recent than ones with the old source value. Numeric sequence numbers are compared to establish order only when their sources match.
Restarting the CDC Jet source will not change sequence number sources, only significant changes on the database side will.
Modifier and Type | Field and Description |
---|---|
static HazelcastProperty |
SEQUENCE_CACHE_EXPIRATION_SECONDS
Number of seconds for which the sink will remember the last seen
sequence number for an input key (used to detect reordering).
|
Modifier and Type | Method and Description |
---|---|
static <K,V> Sink<ChangeRecord> |
map(IMap<? super K,? super V> map,
FunctionEx<? super ChangeRecord,? extends K> keyFn,
FunctionEx<? super ChangeRecord,? extends V> valueFn)
Returns a sink that applies the changes described by a Change Data
Capture (CDC) stream to an
IMap . |
static <K,V> Sink<ChangeRecord> |
map(String mapName,
FunctionEx<? super ChangeRecord,? extends K> keyFn,
FunctionEx<? super ChangeRecord,? extends V> valueFn)
Returns a sink that applies the changes described by a Change Data
Capture (CDC) stream to an
IMap . |
static <K,V> Sink<ChangeRecord> |
remoteMap(String mapName,
ClientConfig clientConfig,
FunctionEx<? super ChangeRecord,? extends K> keyFn,
FunctionEx<? super ChangeRecord,? extends V> valueFn)
Returns a sink equivalent to
map(java.lang.String, com.hazelcast.function.FunctionEx<? super com.hazelcast.jet.cdc.ChangeRecord, ? extends K>, com.hazelcast.function.FunctionEx<? super com.hazelcast.jet.cdc.ChangeRecord, ? extends V>) , but for a map in a remote
Hazelcast cluster identified by the supplied ClientConfig . |
public static final HazelcastProperty SEQUENCE_CACHE_EXPIRATION_SECONDS
The default value is 10 seconds.
@Nonnull public static <K,V> Sink<ChangeRecord> map(@Nonnull String mapName, @Nonnull FunctionEx<? super ChangeRecord,? extends K> keyFn, @Nonnull FunctionEx<? super ChangeRecord,? extends V> valueFn)
IMap
. The main usage is to have
the IMap
mirror the contents of the data table that is the
source of the CDC stream, but since it accepts arbitrary key and
value functions, other behaviors are possible as well.
NOTE: in order for the sink behavior to be predictable, the map should be non-existent or empty at the time the sink starts using it.
For each item the sink receives, it uses the keyFn
to
determine which map key the change event applies to. Then, based
on the ChangeRecord
's Operation
it decides to
either:
Operation.DELETE
)
Operation.SYNC
& Operation.INSERT
)
Operation.UPDATE
)
valueFn
to the change record.
NOTE: if valueFn
returns null
,
then the key will be deleted no matter the operation (ie. even for
update and insert records).
@Nonnull public static <K,V> Sink<ChangeRecord> map(@Nonnull IMap<? super K,? super V> map, @Nonnull FunctionEx<? super ChangeRecord,? extends K> keyFn, @Nonnull FunctionEx<? super ChangeRecord,? extends V> valueFn)
IMap
. The main usage is to have
the IMap
mirror the contents of the data table that is the
source of the CDC stream, but since it accepts arbitrary key and
value functions, other behaviors are possible as well.
NOTE: in order for the sink behavior to be predictable, the map should be non-existent or empty at the time the sink starts using it.
For each item the sink receives it uses the keyFn
to
determine which map key the change event applies to. Then, based
on the ChangeRecord
's Operation
it decides to
either:
Operation.DELETE
)
Operation.SYNC
& Operation.INSERT
)
Operation.UPDATE
)
valueFn
to the change record.
NOTE: if valueFn
returns null
,
then the key will be deleted no matter the operation (ie. even for
update and insert records).
@Nonnull public static <K,V> Sink<ChangeRecord> remoteMap(@Nonnull String mapName, @Nonnull ClientConfig clientConfig, @Nonnull FunctionEx<? super ChangeRecord,? extends K> keyFn, @Nonnull FunctionEx<? super ChangeRecord,? extends V> valueFn)
map(java.lang.String, com.hazelcast.function.FunctionEx<? super com.hazelcast.jet.cdc.ChangeRecord, ? extends K>, com.hazelcast.function.FunctionEx<? super com.hazelcast.jet.cdc.ChangeRecord, ? extends V>)
, but for a map in a remote
Hazelcast cluster identified by the supplied ClientConfig
.
NOTE 1: in order for the sink behavior to be predictable, the map should be non-existent or empty at the time the sink starts using it.
NOTE 2: if valueFn
returns null
,
then the key will be deleted no matter the operation (ie. even for
update and insert records).
Due to the used API, the remote cluster must be at least version 4.0.
Copyright © 2023 Hazelcast, Inc.. All rights reserved.