@@ -68,31 +68,16 @@ private async void Process()
68
68
69
69
try
70
70
{
71
- var iterator = await _tracker . GetNextShardIterator ( sub . AppName , sub . Stream , sub . Shard . ShardId ) ;
72
-
73
- if ( iterator == null )
74
- {
75
- var iterResp = await _client . GetShardIteratorAsync ( new GetShardIteratorRequest ( )
76
- {
77
- ShardId = sub . Shard . ShardId ,
78
- StreamName = sub . Stream ,
79
- ShardIteratorType = ShardIteratorType . AFTER_SEQUENCE_NUMBER ,
80
- StartingSequenceNumber = sub . Shard . SequenceNumberRange . StartingSequenceNumber
81
- } ) ;
82
- iterator = iterResp . ShardIterator ;
83
- }
84
-
85
- var records = await _client . GetRecordsAsync ( new GetRecordsRequest ( )
86
- {
87
- ShardIterator = iterator ,
88
- Limit = _batchSize
89
- } ) ;
71
+ var records = await GetBatch ( sub ) ;
90
72
91
73
if ( records . Records . Count == 0 )
92
74
sub . Snooze = DateTime . Now . AddSeconds ( 5 ) ;
93
75
76
+ var lastSequence = string . Empty ;
77
+
94
78
foreach ( var rec in records . Records )
95
79
{
80
+ lastSequence = rec . SequenceNumber ;
96
81
try
97
82
{
98
83
sub . Action ( rec ) ;
@@ -103,7 +88,10 @@ private async void Process()
103
88
}
104
89
}
105
90
106
- await _tracker . IncrementShardIterator ( sub . AppName , sub . Stream , sub . Shard . ShardId , records . NextShardIterator ) ;
91
+ if ( lastSequence != string . Empty )
92
+ await _tracker . IncrementShardIteratorAndSequence ( sub . AppName , sub . Stream , sub . Shard . ShardId , records . NextShardIterator , lastSequence ) ;
93
+ else
94
+ await _tracker . IncrementShardIterator ( sub . AppName , sub . Stream , sub . Shard . ShardId , records . NextShardIterator ) ;
107
95
}
108
96
finally
109
97
{
@@ -121,6 +109,53 @@ private async void Process()
121
109
}
122
110
}
123
111
112
+ private async Task < GetRecordsResponse > GetBatch ( ShardSubscription sub )
113
+ {
114
+ var iterator = await _tracker . GetNextShardIterator ( sub . AppName , sub . Stream , sub . Shard . ShardId ) ;
115
+
116
+ if ( iterator == null )
117
+ {
118
+ var iterResp = await _client . GetShardIteratorAsync ( new GetShardIteratorRequest ( )
119
+ {
120
+ ShardId = sub . Shard . ShardId ,
121
+ StreamName = sub . Stream ,
122
+ ShardIteratorType = ShardIteratorType . AT_SEQUENCE_NUMBER ,
123
+ StartingSequenceNumber = sub . Shard . SequenceNumberRange . StartingSequenceNumber
124
+ } ) ;
125
+ iterator = iterResp . ShardIterator ;
126
+ }
127
+
128
+ try
129
+ {
130
+ var result = await _client . GetRecordsAsync ( new GetRecordsRequest ( )
131
+ {
132
+ ShardIterator = iterator ,
133
+ Limit = _batchSize
134
+ } ) ;
135
+
136
+ return result ;
137
+ }
138
+ catch ( ExpiredIteratorException )
139
+ {
140
+ var lastSequence = await _tracker . GetNextLastSequenceNumber ( sub . AppName , sub . Stream , sub . Shard . ShardId ) ;
141
+ var iterResp = await _client . GetShardIteratorAsync ( new GetShardIteratorRequest ( )
142
+ {
143
+ ShardId = sub . Shard . ShardId ,
144
+ StreamName = sub . Stream ,
145
+ ShardIteratorType = ShardIteratorType . AFTER_SEQUENCE_NUMBER ,
146
+ StartingSequenceNumber = lastSequence
147
+ } ) ;
148
+ iterator = iterResp . ShardIterator ;
149
+
150
+ var result = await _client . GetRecordsAsync ( new GetRecordsRequest ( )
151
+ {
152
+ ShardIterator = iterator ,
153
+ Limit = _batchSize
154
+ } ) ;
155
+
156
+ return result ;
157
+ }
158
+ }
124
159
125
160
public void Dispose ( )
126
161
{
0 commit comments