redis-stream 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 12a0fad9e74538a076401cd2dc1e27a58c75369d72eb179d8d03a4454141c3a7
4
- data.tar.gz: 399575ac314cbc13e19d25ffb3970576598b7194395192571861b7a0f92a15b3
3
+ metadata.gz: 83de723fa0769050b81548f00ce3d662b9053b1d89974b314f188756af759e1d
4
+ data.tar.gz: 83f878051c67908db42aa52928f2f3ba7746d9d7fd40a888dc9412f40db1fc82
5
5
  SHA512:
6
- metadata.gz: d843bdd4be24eecf5eef0d0f326e3405c2f0e2829d4c545f8e4b13f7d2acf30fc3f8436a4bb010713e6c9e85217b4ddfdf5769cb98bbb05308e33102d09b8140
7
- data.tar.gz: 53cca2ee28d14c21e0f3220d72f2d0fa9c241da2e5aac7f2015c69688637163a8132072be6cf20e878adfc7741fb05ee76b2a811f63f2cdf3804be97cf7944e8
6
+ metadata.gz: dd2618538cb98cd88861e76d3024e5bd54d241669e056763d2986989f6b50cfc7fb24a921aba4d08a6b2ecce005031ac53e9f8639411f991cbe7774fbfec34cc
7
+ data.tar.gz: e781755937ba2901eeafa7273bf7eea5ceb3bfa8a1c6f2011b196b3ae0695b80413342e3fa1b4ebd147eb08fae4f36e6c618685f29c37379f2844419684e2288
@@ -219,8 +219,8 @@ class Redis
219
219
  payload = nil
220
220
 
221
221
  unless @cache.nil?
222
- if options.include?("cache_key")
223
- cache_key = @cache.build_key(data)
222
+ if options.include?("cache_key") && not(options['cache_key'].nil?)
223
+ cache_key = options["cache_key"] # @cache.build_key(data)
224
224
  if @cache.include?(cache_key)
225
225
  if data && data.include?('from_cache') && data['from_cache'].eql?(0)
226
226
  @cache.delete(cache_key)
@@ -237,14 +237,16 @@ class Redis
237
237
  }
238
238
  @logger.info("#{@consumer_id} - fetching from cache with key #{cache_key}")
239
239
  end
240
-
240
+ else
241
+ #cache_key = @cache.build_key(data)
242
+ unless cache_key.nil? || cache_key.empty?
243
+ @logger.info("#{@consumer_id} - caching with key #{cache_key}")
244
+ @cache[cache_key] = data
245
+ end
241
246
  end
242
- else
243
- @logger.info("#{@consumer_id} - fetching from cache with key #{cache_key}")
244
- @cache[options["cache_key"]] = data
245
247
  end
246
-
247
248
  end
249
+
248
250
  if payload.nil?
249
251
  payload = {
250
252
  type: type,
@@ -303,53 +305,53 @@ class Redis
303
305
  # @param [Boolean] async return the message if synchronous else call handle_incoming
304
306
  # @param [Boolean] passthrough Receive all messages also the ones intended for other consumers
305
307
  def read_next_message_from_stream(async = true, passthrough = false)
306
- if @state == Redis::Stream::State::RUNNING
307
- result = @redis.xread(@stream, @lastid, block: 1000, count: 1) if @group.nil?
308
- result = @redis.xreadgroup(@group, @consumer_id, @stream, '>', block: 1000, count: 1) if @group
309
-
310
- unless result.empty?
311
- id, data_out = result[@stream][0]
312
- ack_count = @redis.xack(@stream, @group, id) if @group
313
-
314
- tracer_data = JSON.parse(data_out["tracer"])
315
- unless tracer_data.nil? || tracer_data.empty?
316
- #trace_scope.span.log_kv('has_tracer' => true)
317
- tracer_span = OpenTracing.extract(OpenTracing::FORMAT_TEXT_MAP, tracer_data)
318
- data_out["tracer"] = OpenTracing.start_span(@consumer_id, child_of: tracer_span)
319
- end
320
-
321
- begin
322
- data_out["payload"] = JSON.parse(data_out["payload"])
323
- rescue Exception => e
324
- @logger.error("#{@consumer_id} error parsing payload: #{e.message}")
325
- end
308
+ if @state == Redis::Stream::State::RUNNING
309
+ result = @redis.xread(@stream, @lastid, block: 1000, count: 1) if @group.nil?
310
+ result = @redis.xreadgroup(@group, @consumer_id, @stream, '>', block: 1000, count: 1) if @group
311
+
312
+ unless result.empty?
313
+ id, data_out = result[@stream][0]
314
+ ack_count = @redis.xack(@stream, @group, id) if @group
315
+
316
+ tracer_data = JSON.parse(data_out["tracer"])
317
+ unless tracer_data.nil? || tracer_data.empty?
318
+ #trace_scope.span.log_kv('has_tracer' => true)
319
+ tracer_span = OpenTracing.extract(OpenTracing::FORMAT_TEXT_MAP, tracer_data)
320
+ data_out["tracer"] = OpenTracing.start_span(@consumer_id, child_of: tracer_span)
321
+ end
326
322
 
327
- if data_out["from"].eql?(@consumer_id)
328
- return false
329
- end
323
+ begin
324
+ data_out["payload"] = JSON.parse(data_out["payload"])
325
+ rescue Exception => e
326
+ @logger.error("#{@consumer_id} error parsing payload: #{e.message}")
327
+ end
330
328
 
331
- unless (data_out["to"].nil? || data_out["to"].eql?('') || data_out["to"].eql?('*') || data_out["to"].eql?(@consumer_id)) &&
332
- (data_out["to_group"].nil? || data_out["to_group"].eql?('') || data_out["to_group"].eql?('*') || data_out["to_group"].eql?(@group))
333
- @logger.info("#{@consumer_id} - ignoring message from '#{data_out["from"]}' to '#{data_out["to"]}-#{data_out["to_group"]}'")
329
+ if data_out["from"].eql?(@consumer_id)
330
+ return false
331
+ end
334
332
 
335
- return false
336
- end
333
+ unless (data_out["to"].nil? || data_out["to"].eql?('') || data_out["to"].eql?('*') || data_out["to"].eql?(@consumer_id)) &&
334
+ (data_out["to_group"].nil? || data_out["to_group"].eql?('') || data_out["to_group"].eql?('*') || data_out["to_group"].eql?(@group))
335
+ @logger.info("#{@consumer_id} - ignoring message from '#{data_out["from"]}' to '#{data_out["to"]}-#{data_out["to_group"]}'")
337
336
 
338
- @logger.info("#{@consumer_id} - received from '#{data_out["from"]}' of type '#{data_out['type']}' to '#{data_out["to"]}' in group '#{data_out["to_group"]}' with message id '#{id}' - with ack #{ack_count}")
337
+ return false
338
+ end
339
339
 
340
- if data_out["type"].eql?(Redis::Stream::Type::PING)
341
- add(data_out["payload"].to_s, "to" => data_out["from"], "group" => "*", "type" => Redis::Stream::Type::PONG)
342
- return false
343
- end
340
+ @logger.info("#{@consumer_id} - received from '#{data_out["from"]}' of type '#{data_out['type']}' to '#{data_out["to"]}' in group '#{data_out["to_group"]}' with message id '#{id}' - with ack #{ack_count}")
344
341
 
345
- if data_out["type"].eql?(Redis::Stream::Type::PONG)
346
- return false
347
- end
342
+ if data_out["type"].eql?(Redis::Stream::Type::PING)
343
+ add(data_out["payload"].to_s, "to" => data_out["from"], "group" => "*", "type" => Redis::Stream::Type::PONG)
344
+ return false
345
+ end
348
346
 
349
- return data_out unless async
350
- handle_incoming(data_out)
347
+ if data_out["type"].eql?(Redis::Stream::Type::PONG)
348
+ return false
351
349
  end
350
+
351
+ return data_out unless async
352
+ handle_incoming(data_out)
352
353
  end
354
+ end
353
355
  rescue Exception => e
354
356
  return false
355
357
  end
@@ -5,11 +5,13 @@ require 'redis/stream/config'
5
5
  class Redis
6
6
  module Stream
7
7
  class DataCache
8
- def initialize
8
+ def initialize(logger = Logger.new(STDOUT))
9
+ @logger = logger
9
10
  @cache = Moneta.new(:HashFile, dir: Redis::Stream::Config[:data_cache] || "/tmp/cache", serializer: :json)
10
11
  end
11
12
 
12
13
  def []=(key, value)
14
+ @logger.info("CACHE - #{File.basename(__FILE__)}:#{__LINE__} - caching with key #{key}")
13
15
  @cache.store(key, value)
14
16
  end
15
17
 
@@ -18,6 +20,10 @@ class Redis
18
20
  end
19
21
 
20
22
  def include?(key)
23
+ key?(key)
24
+ end
25
+
26
+ def key?(key)
21
27
  @cache.key?(key)
22
28
  end
23
29
 
@@ -38,9 +44,55 @@ class Redis
38
44
  id = payload_data["id"].downcase
39
45
  key = "#{action}_#{id}"
40
46
  end
47
+ raise "Empty cache key" if key.nil? || key&.empty?
41
48
  key
42
49
  end
43
50
 
51
+ def resolve_by_message(pid, payload, &block)
52
+ data = nil
53
+ cache_key = build_key(payload)
54
+ invalidate_cache(cache_key, payload)
55
+ data = load_from_cache(cache_key)
56
+ data = load_from_service(pid, cache_key, &block) if data.nil?
57
+
58
+ data
59
+ end
60
+
61
+ private
62
+ def invalidate_cache(cache_key, payload)
63
+ if payload&.include?('from_cache') && payload['from_cache'].eql?('0')
64
+ delete(cache_key)
65
+ @logger.warn("CACHE - #{File.basename(__FILE__)}:#{__LINE__} - invalidating key #{cache_key}")
66
+ end
67
+ end
68
+
69
+ def load_from_cache(cache_key)
70
+ data = nil
71
+ if key?(cache_key)
72
+ @logger.info("CACHE - #{File.basename(__FILE__)}:#{__LINE__} - fetching with key #{cache_key}")
73
+ data = get_from_cache(cache_key)
74
+ end
75
+ data
76
+ end
77
+
78
+ def load_from_service(pid, cache_key)
79
+ data = nil
80
+ data = yield pid, cache_key if block_given?
81
+
82
+ if data.nil? || data&.empty?
83
+ @logger.warn("CACHE - #{File.basename(__FILE__)}:#{__LINE__} - empty result for key #{cache_key} and id #{pid}")
84
+ end
85
+
86
+ data
87
+ end
88
+
89
+ def get_from_cache(cache_key)
90
+ include?(cache_key)
91
+
92
+ data = self[cache_key]
93
+ data = get_from_cache(data['parent']) if data.key?('parent')
94
+ data
95
+ end
44
96
  end
45
97
  end
46
98
  end
@@ -1,6 +1,6 @@
1
1
  #encoding: UTF-8
2
2
  class Redis
3
3
  module Stream
4
- VERSION = "0.4.4"
4
+ VERSION = "0.4.5"
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-stream
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mehmet Celik
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-02 00:00:00.000000000 Z
11
+ date: 2020-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler