busdriver 0.1 → 0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/Gemfile +5 -0
  2. data/Gemfile.lock +21 -0
  3. data/lib/busdriver.rb +142 -0
  4. metadata +11 -8
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "redis", require: ["redis/connection/hiredis", "redis"]
4
+
5
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,21 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ busdriver (0.1)
5
+ hiredis
6
+ press
7
+ redis
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ hiredis (0.4.5)
13
+ press (0.1)
14
+ redis (2.2.2)
15
+
16
+ PLATFORMS
17
+ ruby
18
+
19
+ DEPENDENCIES
20
+ busdriver!
21
+ redis
data/lib/busdriver.rb ADDED
@@ -0,0 +1,142 @@
1
+ require "redis"
2
+ require "json"
3
+ require "securerandom"
4
+ require "press"
5
+
6
+ module Busdriver
7
+ extend Press
8
+
9
+ TIMEOUT = 3
10
+
11
+ def self.timeout=(timeout)
12
+ @timeout = timeout
13
+ end
14
+
15
+ def self.timeout
16
+ @timeout ||= ENV['BUSDRIVER_TIMEOUT'] || TIMEOUT
17
+ end
18
+
19
+ TIME_TO_LIVE = 30
20
+
21
+ def self.time_to_live=(time_to_live)
22
+ @time_to_live = time_to_live
23
+ end
24
+
25
+ def self.time_to_live
26
+ @time_to_live ||= ENV['BUSDRIVER_TIME_TO_LIVE'] || TIME_TO_LIVE
27
+ end
28
+
29
+ TIME_TO_EXPIRE = 90
30
+
31
+ def self.time_to_expire=(time_to_expire)
32
+ @time_to_expire = time_to_expire
33
+ end
34
+
35
+ def self.time_to_expire
36
+ @time_to_expire ||= ENV['BUSDRIVER_TIME_TO_EXPIRE'] || TIME_TO_EXPIRE
37
+ end
38
+
39
+ def self.urls=(urls)
40
+ @urls = urls
41
+ end
42
+
43
+ def self.urls
44
+ @urls ||= ENV['BUSDRIVER_URLS'].split(",")
45
+ end
46
+
47
+ def self.url=(url)
48
+ @url = url
49
+ end
50
+
51
+ def self.url
52
+ @url ||= urls[ENV['BUSDRIVER_ZONE'].ord % urls.size]
53
+ end
54
+
55
+ def self.connect(url)
56
+ Redis.connect(url: url, timeout: timeout)
57
+ end
58
+
59
+ def self.conns
60
+ @conns ||= urls.map { |url| connect(url) }
61
+ end
62
+
63
+ def self.conn
64
+ @conn ||= connect(url)
65
+ end
66
+
67
+ def self.header_format
68
+ { message_id: SecureRandom.uuid, published_on: Time.now.to_i, ttl: time_to_live }
69
+ end
70
+
71
+ def self.publish(key, data)
72
+ header = header_format
73
+ payload_json = JSON.dump(header: header, payload: data)
74
+ printfm __FILE__, __method__, header, key: key
75
+ conns.shuffle.each do |conn|
76
+ begin
77
+ conn.rpush(key, payload_json)
78
+ conn.expire(key, time_to_expire) rescue nil
79
+ printfm __FILE__, __method__, at: "published", key: key
80
+ rescue => e
81
+ printfme __FILE__, __method__, e, host: conn.client.host
82
+ end
83
+ end
84
+ end
85
+
86
+ def self.subscribe(keys, &blk)
87
+ while true
88
+ begin
89
+ key, payload_json = conn.blpop(*keys, 1)
90
+ if payload_json
91
+ payload = JSON.parse(payload_json)
92
+ header, data = payload.values_at("header", "payload")
93
+ published_on, ttl = header.values_at("published_on", "ttl")
94
+ printfm __FILE__, __method__, header, key: key
95
+ if Time.now.to_i - published_on.to_i > ttl
96
+ printfm __FILE__, __method__, header, at: "timeout", key: key
97
+ else
98
+ begin
99
+ printfm __FILE__, __method__, header, at: "received", key: key
100
+ yield key, data
101
+ printfm __FILE__, __method__, header, at: "processed", key: key
102
+ rescue => e
103
+ printfme __FILE__, __method__, e
104
+ end
105
+ end
106
+ end
107
+ rescue => e
108
+ printfme __FILE__, __method__, e, host: conn.client.host
109
+ raise e
110
+ end
111
+ end
112
+ end
113
+
114
+ def self.counts(pattern)
115
+ llen, llens = 0, Hash.new(0)
116
+ conns.shuffle.each do |conn|
117
+ begin
118
+ conn.keys(pattern).each do |key|
119
+ len = conn.llen(key)
120
+ llen += len
121
+ llens[key] += len
122
+ end
123
+ rescue => e
124
+ printfme __FILE__, __method__, e, host: conn.client.host
125
+ end
126
+ end
127
+ printfm __FILE__, __method__, llens, length: llen
128
+ end
129
+
130
+ def self.drain(pattern)
131
+ conns.shuffle.each do |conn|
132
+ begin
133
+ conn.keys(pattern).each do |key|
134
+ conn.del(key)
135
+ printfm __FILE__, __method__, key: key
136
+ end
137
+ rescue => e
138
+ printfme __FILE__, __method__, e, host: conn.client.host
139
+ end
140
+ end
141
+ end
142
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: busdriver
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: '0.2'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-05-22 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: hiredis
16
- requirement: &2152276100 !ruby/object:Gem::Requirement
16
+ requirement: &2152194180 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152276100
24
+ version_requirements: *2152194180
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: redis
27
- requirement: &2152274860 !ruby/object:Gem::Requirement
27
+ requirement: &2152163240 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2152274860
35
+ version_requirements: *2152163240
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: press
38
- requirement: &2152274000 !ruby/object:Gem::Requirement
38
+ requirement: &2152160860 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,13 +43,16 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2152274000
46
+ version_requirements: *2152160860
47
47
  description: A highly available redis bus client for Ruby apps.
48
48
  email: mark.fine@gmail.com
49
49
  executables: []
50
50
  extensions: []
51
51
  extra_rdoc_files: []
52
- files: []
52
+ files:
53
+ - lib/busdriver.rb
54
+ - Gemfile
55
+ - Gemfile.lock
53
56
  homepage: http://github.com/mfine/busdriver
54
57
  licenses: []
55
58
  post_install_message: