Skip to content

Commit 03411ce

Browse files
committed
Kafka watcher
0 parents  commit 03411ce

File tree

5 files changed

+78
-0
lines changed

5 files changed

+78
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
*.pyc

handlers/Dump.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class Dump(object):
2+
3+
def __init__(self, **params):
4+
print(params)
5+
6+
def handle(self, topic, message):
7+
print(topic)
8+
print(message)

handlers/Memcached.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import memcache
2+
3+
class Memcached:
4+
5+
def __init__(self, hostname, **params):
6+
self.mc = memcache.Client([hostname])
7+
8+
def handle(self, topic, message):
9+
cmd = message['cmd']
10+
if not hasattr(self, cmd):
11+
raise Exception("Unknown command: " + cmd)
12+
getattr(self, cmd)(message)
13+
14+
def set(self, message):
15+
print("Set {0}-{1}-{2}".format(message['key'].encode('utf-8'), message['val'].encode('utf-8'), int(message['ttl'])))
16+
self.mc.set(message['key'].encode('utf-8'), message['val'].encode('utf-8'), int(message['ttl']) )
17+
18+
def delete(self, message):
19+
self.mc.delete(message['key'])

kafka-watcher.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#!/usr/bin/python
2+
import yaml
3+
import argparse
4+
from kafka import KafkaConsumer
5+
import imp
6+
import json
7+
import sys
8+
9+
parser = argparse.ArgumentParser(description='Process cache relay commands from Kafka')
10+
parser.add_argument('--config', required=True, help='YAML configuration file')
11+
script_args = parser.parse_args()
12+
13+
config_file = open(script_args.config)
14+
config = yaml.safe_load(config_file)
15+
16+
if 'listeners' not in config:
17+
raise Exception('listeners config required')
18+
19+
topics = []
20+
handlers = {}
21+
for listener in config['listeners']:
22+
topics.append(listener['topic'])
23+
fp, pathname, description = imp.find_module(listener['handler'], ['handlers'])
24+
mod = imp.load_module(listener['handler'], fp, pathname, description)
25+
klass = getattr(mod, listener['handler'])
26+
handlers[listener['topic']] = klass(**listener['params'])
27+
28+
consumer = KafkaConsumer(*topics)
29+
for msg in consumer:
30+
if msg.topic not in handlers:
31+
print("Weird, unknown topic %s" % msg.topic)
32+
continue
33+
try:
34+
data = json.loads(msg.value)
35+
except ValueError:
36+
data = None
37+
if not data:
38+
print("Could not parse data, meh")
39+
continue
40+
# try:
41+
handlers[msg.topic].handle(msg.topic, data)
42+
# except:
43+
# e = sys.exc_info()
44+
# print("Oops, something happened: " + str(e))

watcher.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
listeners:
2+
- topic: wancache-purge
3+
handler: Memcached
4+
params:
5+
hostname: localhost:11211
6+

0 commit comments

Comments
 (0)