- Update to Spring Boot 3.4.2
- Update to Edison 3.4.2
- Update to AWS SDK 2.30.8
- Update to Spring Boot 3.3.2 and Edison 3.3.0
- Dependency updates
- Fix warnings that the bean post processors are declared through a non-static factory method
- Upgrade to spring-boot 3.2.2
- Dependency updates
- aws-sdk 2.22.9 changes communication format for sqs from XML to JSON
- Add -parameters compile flag to avoid warnings
- Fix deprecation warnings for thymeleaf includes which started with spring boot 3.x.
- Update to spring-boot 3.1.0
- Dependency updates
synapse-kinesis
- Add timeout of 60 seconds to GetRecords call in KinesisShardIterator which acts as workaround for a problem with AWS SDK > 2.17.115 (aws/aws-sdk-java-v2#3335)
- Update to Edison and Spring Boot 2.7.1
- Dependency updates
- Dependency updates
change default synapse.aws.region back to "eu-central-1" to prevent breaking change
all Dependency updates change default synapse.aws.region to "us-east-1"
synapse-kafka
- Kafka support was dropped
synapase-kinesis
- Bugfix NullCheck for response.failedRecordCount() in KinesisMessageSender
- Bugfix configure skipNextEmptyParts in KinesisMessageLogReader
synapse-compaction-aws-s3
- Bugfix: S3Helper's listAll function is capable of returning more than 1000 files now.
all
- Update all dependencies to latest versions
synapse-edison
- Update to Edison Microservice 2.5.1 (with Spring Boot 2.5.1)
synapse-edison
- Update to Edison Microservice 2.5.0 (with Spring Boot 2.5.0)
all
- Update to edison-microservice 2.4.7
all
- Update all dependencies to latest versions
all
- Update to spring boot 2.4.0
synapse-kafka
- Update to apache kafka 2.6.0
synapse-edison
- Bugfix: don't read variable "spring.profiles.active" directly because it's considered 'internal' and won't work with spring boot 2.4 anymore
synapse-edison
- Bugfix: StatusIndicatingStateRepository now starts correctly thanks to SmartLifecycle.
synapse-compaction-aws-s3
- Bugfix: Use multipart upload to upload snapshot files larger than 5 GB, which is the current limit for simple put file operations in S3
synapse-compaction-aws-s3
- Bugfix: Removed file pointer leak in temp file logging function.
synapse-compaction-aws-s3
- The log marker that is given to the compact()-function is also used to create the compacting event source now
synapse-edison
- Messagetrace now saves a configurable amount of messages per channel. Before, a channel could
run empty in the message trace because of vast activity on any other channel overriding the message trace
up to the overall capacity. Default capacity per channel is
100
. The overall message trace now only preserves insertion order by channel, not across all channels.
synapse-kinesis
- Bugfix: KinesisMessageSender: split batches when total record size exceeds 5mb.
synapse-kinesis
- Bugfix: Better handling for invalid GetRecordsResponses without millisBehindLatest.
synapse-kinesis
- Bugfix: Don't throw NPEs when GetRecordsResponse contains an empty list of records.
synapse-kafka
- Add timestamp of last received record to ShardPosition
synapse-kafka
- Fix durationBehind calculation for partitions with different offsets
synapse-kafka
- Create separate bean for Kafka consumer factory so that it can be overridden
- Make Kafka receiver logging less verbose
synapse-testsupport
- Fixes bug that was introduced through renaming the default bean names of the message log and message queue configurations to implementation-specific ones, which was not reflected in the in-memory variants
synapse-kafka
- Fixes bug that partitions were fetched on every send
synapse-kafka
- Ensures the correct order in which a partition is used in MessageSender
synapse-core
- Adds support for subscriptions, giving service the possibility to subscribe / unsubscribe to messages for a number of entities.
synapse-kafka
- Adds support for Kafka senders and receivers.
synapse-aws-kinesis
- Log exception type and whether a failed operation will be retried in retryCondition
synapse-edison
- Fixes the StateRepositoryMetricsReporter in case the received message references a channel that is not created on startup
synapse-edison
- Add StateRepositoryMetricsReporter to log the size of state repositories
synapse-aws-kinesis
- Enable retry if SDKClientExceptions occur
synapse-aws-kinesis
- Add retry mechanism for expired Kinesis shard iterators
- Latest AWS SDK 2.10.56 as advised by AWS due to bugfixes
- Introduces FixedChannelHealthIndicator to measure health of asynchronously added eventsources
synapse-core
- Fixes configuration of default ObjectMapper in that unknown properties are ignored during deserialization of messages.
- Adds new annotation @EnableMessageLogReceiverEndpoint to support annotation-driven configuration of MessageLogReceiverEndpoints.
- Adds new NitriteStateRepository, including support for secondary indexes.
- Introduces MessageSender interface
- Adds a simple TeeMessageSender that is sending messages to multiple delegate MessageSenders.
synapse-core
- add messageFormat attribute in @EnableMessageSenderEndpoint to be able to send meta data (e.g. versions)
General
- Latest AWS SDK 2.10.4 (which brings Jackson 2.10.0 and Netty 4.1.42.Final)
- Fix some degraded tests which broke through spring boot update
General
- Update to Edison 2.2.0, Spring Boot 2.2 and Spring 5.2
General
- Set compile target compatibility to Java 8
Release accidentally built with Java 12. Please use version 0.18.1 instead.
General
- Updates to Gradle 5.6.3
synapse-aws-kinesis
- Bugfix: Fallback to reading from horizon in case the initial shard iterator request leads to an exception
General
- Updates to AWS SDK 2.9.10
- Updates to Mockito 3.1.0
synapse-core
- ObjectMapper is now @ConditionalOnMissingBean
General
- Dependency updates
synapse-edison
- Log duration behind for every channel to micrometer when property
synapse.edison.metrics.enabled=true
Bugfix
- Improve exception handling in InMemoryChannel (to match other channels)
Bugfix
- Fix counter of messages in KinesisShardReader
CompactionService
- Enable marker support to some classes that are used during compaction
- Some more info logging during snapshot message dispatching
StateRepository
- Don't use on-heap keySet in ChronicleMapStateRepository
StateRepository
- You can specify your own custom ValueMarshaller for your ChronicleMapStateRepository. Add the valueMarshaller to the ChronicleMapBuilder AND specify .withCustomValueMarshaller(true) when building the ChronicleMapStateRepository.
MessageStore
- MessageStore has a isCompacting() property now which is used to dispatch messages from snapshots concurrently. This speeds up the processing of compacted snapshots at startup significantly.
Bugfixes
- Fixes the exception for an empty result of entries in the staterepository
- Fix re-using of already downloaded snapshots when having multiple channels (wildcard deletion of snapshots before downloading was too wild)
Bugfixes
- Fixes NPE for null payloads in message traces and journals
Journaling, MessageTrace, StateRepository
- Adds short help texts to Edison UIs
Bugfixes
- Messages that can not be translated and/or processed by consumers will not be deleted from SQS anymore, so that the message will be sent to the dead-letter queue after some time.
MessageStore
- Removes unused MessageStore.getName()
Journaling
- Introduces journaling for event-sourced entities stored in a StateRepository.
Using message journals, it is possible to retrieve all messages that where used to modify
the state of an event-sourced entity. Have a look at
de.otto.synapse.journal.Journal
for more information.
- Fixes bean instantiation of sqs retry policy.
- Adds a retry policy to sqs async client.
- Adds an edison status detail indicator to expose the number of entries in a state repository.
StateRepository
-
Fixes design flaw of
MessageStore
: the stores can now contain messages from different channels. -
Removes WritableMessageStore interface and adds optional method
MessageStore.add()
-
Introduces required property
StateRepository.getName()
-
StatefulMessageConsumer now supports BiFunctions as arguments. This way, the consumer is able to modify existing entries in the
StateRepository
by applying theBiFunction
to the existing state and the incoming message. -
Adds an UI and a REST API to access entities of a StateRepository in Edison microservices.
MessageStore
-
Adds possibility to add indexes to a
MessageStore
that can be used to filter messages by partitionKey, channel, hostname, etc. pp.By indexing the partition-key of the messages, it is possible to retrieve all messages that where changing the state of a single entity.
Leader Election
- Implements a simple Leader Election using Redisson RLock
- Fixes deployment of Kinesis services by reducing the polling after Kinesis has been fully consumed
- Fixes NPE in message traces if payload is null
- Introduces TextMessage that is used instead of Message.
- Fixes possible threading issue in ObjectMappers.
- Updates to edison-microservice 2.0.0-rc3
- Fixes resource leak in CompactionService that was causing creation of additional threads with every compaction.
- Because of some changing default behaviour in Spring regarding overriding beans, your might discover
BeanDefinitionOverrideExceptions when running tests or your application. Consider setting property
spring.main.allow-bean-definition-overriding=true
.
- Introduces consumeAll() in StateRepository
- Sets keySet() in StateRepository to be deprecated as implementations did a full copy the map causing errors on bigger maps, use consumeAll instead
- Fixes broken links in message traces
- Adds blocking send + retries to Kinesis message senders in order to avoid rate-limit exceeded situations
-
Updates to AWS SDK release version 2.2.0
-
Updates to Spring Boot 2.0.4 + Edison Microservice 2.0 + Spring 5.0.8
-
Refactors creation of Header objects:
- Renames emptyHeader() to of()
- Renames requestHeader(...) to of(...)
- Renames responseHeader(...) to of(...)
-
Fixes bug in Kinesis filterValues endpoints, that prevented registered MessageInterceptors to intercept received messages.
-
Fixes usage of Kinesis 'approximateArrivalTimestamp'
-
Fixes possible out-of-order arrival of messages if the message key is not suitable for selecting the same partition for all messages of a single entity. For example, product-messages will get out of order, if the message type (price-update, availability-update) and so on is used to create a message key.
-
Introduces message Key and refactors Message.getKey() etc. to use Key instead of String.
Using Key, it is now possible to distinguish between a partitionKey used to select the channel partition (shard), and a compactionKey used to do the message compaction.
-
Extends serialization format (MessageCodec) to add partitionKey and compactionKey into the message.
-
Adds ordering of MessageInterceptors
-
StateRepository is now an interface.
-
Adds DelegatingStateRepository
-
Adds EdisonStateRepository
-
Refactors StateRepository to return Optionals consistently
- Adds ChannelResponse and ShardResponse to the core packages and introduces new possibility to stop message-consumption using predicates in MessageLogReceiverEndpoints.
- @EnableMessageSenderEndpoint does not use a default value for selectors anymore as this is prone to errors.
- Adds possibility to override the ObjectMapper used by Synapse
- Fix serialization error on polymorph payload objects
- Fixes + refactorings
-
Introduces ObjectMappers.defaultObjectMapper() and removes usage of ObjectMapper from Spring Boot, as this is not under control of Synapse and might be configured in a way that prevents Synapse to parse messages generated by a different application
-
Refactors registration of message interceptors: interceptors can now only be registered at the MessageInterceptorRegistry, not directly at an InterceptorChain anymore.
This prevents bugs where interceptors are getting lost after registration like, for example, in the MessageTrace configuration.
-
Adds possibility to send and receive custom headers for Kinesis channels. Introduces new transport-format for Kinesis messages: beside the old one (Kinesis paylpoad = message payload), a new format is added, where custom message-header attributes are supported by adding format version and message headers to the Kinesis payload.
While 0.12.0 receivers are still able to read from Synapse Kinesis streams generated by 0.11.0 senders, old 0.11.0 receivers will not be able to read messages sent by 0.12.0 senders anymore.
-
Adds possibility to send and receive custom headers for SQS channels
-
Introduces
DefaultSenderHeaderInterceptor
to automatically set some headers when sending messages:- message ID
- sender name
- sender timestamp
- Re-add method
purgeQueue
toSqsClientHelper
- add further exceptions to retry template when consuming
- Introduced new module
synapse-aws-auth
containing the configuration of an AwsCredentialsProvider. - Introduced new module
synapse-compaction-aws-s3
for message compaction using AWS S3. - Introduced new module
synapse-aws-sqs
for SQS message queues. - Introduced new module
synapse-aws-kinesis
for Kinesis message logs. - Updates from old synchronous KinesisClient to new KinesisAsyncClient.
- Adds
@MessageInterceptor
annotation used to easily intercept messages at sender and/or filterValues side of a channel. - Adds possibility to configure a RetryPolicy for Kinesis.
- Moved annotations etc. from
de.otto.synapse.annotation.messagequeue
tode.otto.synapse.annotation
. - Renames ChronicleMapStateRepository.chronicleMapConcurrentMapStateRepositoryBuilder() to .builder().
- Updates 3rd-party dependencies:
- springVersion = "4.3.20.RELEASE"
- springBootVersion = "1.5.17.RELEASE"
- edisonVersion = "1.2.30"
- Adds new module 'synapse-redis' containing a preliminary version of a RedisMessageStore
- Updates to aws-java-sdk-preview-12
- Fixes naming of
MessageQueueReceiverEndpoint
beans using@EnableMessageQueueReceiverEndpoint
annotations - Separated configuration of event sources and message queues. In case of annotation-based configuration,
nothing has to be changed. Only if no
EnableEventSource
annotation is used, the auto-configuration must now be triggered by adding the newEnableEventSourcing
annotation to one of your Spring configurations. - Added annotations-based configuration of
MessageSenderEndpoints
using the new annotationEnableMessageSenderEndpoint
. Both Kinesis and SQS message senders are supported and automatically configured. - Removed dependency to
de.otto.edison:edison-aws-s3
. The configuration has changed as follows:aws.region
renamed tosynapse.aws.region
aws.profile
renamed tosynapse.aws.profile
MessageSenderEndpoint.send(Message)
andMessageSenderEndpoint.sendBatch(Stream<Message>)
are now returning CompletableFuture.
- Fixes startup of application context when eventsources are missing or not available
- Log times required to consume streams at startup
- Adds annotation @EnableMessageQueueReceiverEndpoint to auto-configure SQS message-queue receivers
- Adds annotation @MessageQueueConsumer to auto-configure SQS message-queue listeners
- Adds message tracing for SQS queues to sender- and filterValues-endpoints
- Adds combined message trace for all sender and filterValues channels
- Introduces synapse-testsupport with separate in-memory configurations for message logs and message queues
Breaking Change: Beans need to be qualified.
- Register two MessageSenderEndpointFactories:
- kinesisMessageSenderEndpointFactory for Kinesis
- sqsMessageSenderEndpointFactory for SQS
- Fix bug in KinesisShardIterator. Read next record when there is no data near the part of the shard pointed to by the ShardIterator. See https://docs.aws.amazon.com/streams/latest/dev/troubleshooting-consumers.html#getrecords-returns-empty.
- Fix name for InMemoryMessageSenderFactory in InMemoryTestConfiguration to override kinesisSenderEndpointFactory in autowiring
- Update dependency to edison-aws 0.4.1 which works with AWS SDK preview 10
- Updated to AWS SDK preview 10
- Added support for AWS SQS with SqsMessageSender and SqsMessageQueueReceiverEndpoint
- New KinesisMessageLogReader for low-level polling of Kinesis messages.
- Refactored interfaces for
EventSource
andMessageLogReceiverEndpoint
. The interfaces now immediately return a CompletedFuture instead of blocking forever. - Add StartFrom AT-POSITION to access entries in the stream directly
- Add ConditionalOnMissingBean to ObjectMapper in SynapseAutoConfiguration
- Fixes bug that don't create a new message when retry with a corrupt byte buffer
- Adds message traces for sender- and filterValues endpoints to Edison µServices.
- Fixes bug that SnapshotAutoConfiguration is not injecting the ApplicationEventPublisher into SnapshotMessageStore instances created by the SnapshotMessageStoreFactory.
- Log message meta data when put to kinesis failed
- Fixes bug in MessageReceiverEndpointInfoProvider resulting in a broken presentation of status details.
- Disabling of synapse-edison is now more consistent. The different Health Indicators can now be disabled using the
following properties:
StartUpHealthIndicator
: synapse.edison.health.startup.enabled=falseSnapshotReaderHealthIndicator
: synapse.edison.health.snapshotreader.enabled=falseMessageReceiverEndpointHealthIndicator
: synapse.edison.health.messagereceiver.enabled=false
- Introduced interfaces for MessageEndpoint, MessageReceiverEndpoint, MessageLogReceiverEndpoint and MessageQueueReceiverEndpoints.
- Refactored the creation of EventSources: The associated MessageLogReceiverEndpoints are now registered in the ApplicationContext, so it is possible to inject these into other beans.
- Removed
EnableEventSource#builder()
and replaced it by an auto-configuration of the newMessageSenderEndpointFactory
andMessageLogReceiverEndpointFactory
instances, together with the (also new) general-purposeDefaultEventSource
implementation that is replacing the different otherEventSource
implementations. - Simplified the configuration of in-memory implementations of the different endpoints for
testing purposes. It is now possible to just add
@ImportAutoConfiguration(InMemoryTestConfiguration.class)
to your test configuration to do this. - Removed
Predicate
fromEventSource
andMessageLogReceiverEndpoint
interfaces and replaced it byconsumeUntil()
methods taking anInstant
as a parameter to stop message retrieval at a specified timestamp. - Removed
durationBehind
from channel- and shard-positions. - Introduced type
ChannelDurationBehind
that is used in notifications to announce the duration that consumers are behind of the channel head position. - Renamed
EventSourcingHealthIndicator
toMessageReceiverEndpointHealthIndicator
- Introduced
SnapshotReaderHealthIndicator
- Renamed
EventSourcingStatusDetailIndicator
toMessageReceiverStatusDetailIndicator
- Introduced
SnapshotStatusDetailIndicator
- Refactored eventsource notifications and separated them into
SnapshotReaderNotification
andMessageReceiverNotification
.
- Added
StartupHealthIndicator
that is unhealthy until all EventSources are (almost) up to date. - Added possibility to consume MessageLogs from timestamp
- Fixed problem that the KinesisShardIterator will not recover after an exception is thrown
- Introduced MessageEndpointConfigurer used to register MessageInterceptors at MessageSender- and/or MessageReceiverEndpoints.
- Added MessageFilter as a special implementation of a MessageInterceptor that is used to filter messages depending on a Predicate
- Using key-value pairs in (some) log messages
- Speedup snapshot creation and log progress
- Introduce special SnapshotEventSourceNotification that additionally holds the timestamp of snapshot creation.
- Renamed project to OTTO Synapse:
- eventsourcing-core -> synapse-core
- eventsourcing-aws -> synapse-aws
- eventsourcing-edison-integration -> synapse-edison
- Renamed packages to de.otto.synapse.*
- Renamed properties to synapse.*
- Introduced eventsourcing-aws and removed aws-specific parts from eventsourcing-/synapse-core
- Renamed Event to Message and removed EventBody
- [eventsourcing-edison-integration] Add health indicator for stream state. This means that a service goes unhealthy if a stream is in a not-recoverable state.
- [eventsourcing-core] Fix retry policy in
KinesisShardIterator
to retry also on connection errors, not only on throughput exceed errors.
Remove Clock
bean as this is required only for tests.
Don't set StatusDetailIndicator to warn when kinesis consumer has finished.
Add Clock
bean that is required by EventSourcingStatusDetailIndicator
- New sub project
eventsourcing-edison-integration
. This project contains aStatusDetailIndicator
that provides StatusDetail information for each EventSource.
- Also publish EventSourceNotification Application Events for Kinesis and InMemory EventSources
- Remove further ChronicleMap closed errors on shutdown.
- Prevent ChronicleMap closed errors on shutdown.
- Add
sendEvents
method toEventSender
interface.
- Breaking changes:
- Change signature of
KinesisEventSender.sendEvents
. Send events takes a list ofEventBody
now - Split Event class into
Event
andEventBody
CompactionService
now requires aStateRepository
with namecompactionStateRepository
- Change signature of
- InMemory EventSender and EventSource for testing
- Events with "null"-payload will delete the entry.
- Remove client side encryption because kinesis now supports server side encryption.
SnapshotReadService
now allows to set a local snapshot file to read from instead retrieving it from AWS S3.
This functionality was moved fromSnapshotEventSource
and also works for aCompactingKinesisEventSource
now.
- Provide
EncryptedOrPlainJsonTextEncryptor
that checks whether data is plain json or is encrypted.
- Add option to send unencrypted events to
KinesisEventSender.sendEvent(String, Object, boolean)
andKinesisEventSender.sendEvents(Map<String,Object>, boolean)
- Fix statistics
- Clear state repository after compaction job
- Released to keep things stable
Initial Release