busdriver 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
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: