@@ -15,7 +15,8 @@ class KinesisBatchSender
1515 'ValidationException' ,
1616 ] . freeze
1717
18- BATCH_TOO_LARGE_PATTERN = /too large/i
18+ # Kinesis rejects any record whose data blob exceeds 1 MB.
19+ KINESIS_MAX_RECORD_BYTES = 1_048_576
1920
2021 # Send a batch of database events to Kinesis
2122 #
@@ -43,9 +44,7 @@ def send_stream_batch(stream_name, stream_events)
4344 response = kinesis_client . put_records ( stream_name :, records :)
4445 process_response ( response , stream_events )
4546 rescue Aws ::Kinesis ::Errors ::ValidationException => e
46- raise unless e . message . match? ( BATCH_TOO_LARGE_PATTERN )
47-
48- handle_batch_too_large ( stream_name , stream_events )
47+ handle_validation_error ( stream_name , stream_events , e . message )
4948 rescue StandardError => e
5049 # Handle transient errors (throttling, network issues, service unavailable)
5150 handle_transient_batch_error ( e , stream_events )
@@ -94,24 +93,28 @@ def create_failed_event(event, error_code:, error_message:, transient:)
9493 )
9594 end
9695
97- def handle_batch_too_large ( stream_name , stream_events )
96+ # Isolate the offending record(s) when Kinesis rejects the batch with a
97+ # ValidationException (aggregate payload too large, per-record size limit,
98+ # invalid partition key, etc.). Splits the batch in half and retries
99+ # recursively until a single offending event is marked as a permanent failure.
100+ def handle_validation_error ( stream_name , stream_events , error_message )
98101 if stream_events . size <= 1
99- # Single event exceeds payload limit — treat as permanent failure
100102 return {
101103 succeeded : [ ] ,
102104 failed : stream_events . map do |event |
103105 create_failed_event (
104106 event ,
105107 error_code : 'ValidationException' ,
106- error_message : 'Record exceeds Kinesis payload limit' ,
108+ error_message :,
107109 transient : false ,
108110 )
109111 end ,
110112 }
111113 end
112114
113115 Rails . logger . warn (
114- "[journaled] Batch too large for Kinesis (#{ stream_events . size } events), splitting in half and retrying" ,
116+ "[journaled] Kinesis ValidationException for batch of #{ stream_events . size } events " \
117+ "(#{ error_message } ), splitting in half and retrying" ,
115118 )
116119
117120 mid = stream_events . size / 2
0 commit comments