20
Simultaneous Access Control with a full open source stack Walter Traspadini @uollter

Session Control @ nolinux day

Embed Size (px)

DESCRIPTION

How to implement a session control system scalable and reliable with an open source stack.

Citation preview

Page 1: Session Control  @ nolinux day

SimultaneousAccess Control

with a full open source stack

Walter Traspadini @uollter

Page 2: Session Control  @ nolinux day

non conventional architecture (?)

why redis ?

why flask ?

Page 3: Session Control  @ nolinux day

Redis.io

Salvatore Sanfilippo@antirez

Sponsored by

Open Source

key-value store

no-sql ?((made in italy)

Page 4: Session Control  @ nolinux day

Who is using Redis

Page 5: Session Control  @ nolinux day

Redis.io

keys can expire

master-slave

in memory dataset persistence

Data Structure

- String

- Integer (mainly for counting)

- List

- Set

- Ordered set

- Hash stored list

Page 6: Session Control  @ nolinux day

Don't do this !!

rs = redis.Redis()

rs.keys('*')- time complexity O(n)- 10^6 keys database in 40 msec.

- IT MAY RUIN PERFORMANCES

Page 7: Session Control  @ nolinux day

Best practicesSADD SERVICES [QOL, S24, PROF]

HSET SERVICE:QOL expire 60HSET SERVICE:QOL max_count 1HSET SERVICE:QOL:bob max_count 3

ZADD ACTIVITY:QOL:bob:20121010 '14:50 Login' 1450ZADD ACTIVITY:QOL:bob:20121010 '15:15 Logout' 1515

ZRANGE ACTIVITY:QOL:bob:20121010 1200, 1600 O(log(N) + M) (N: # of elements in the sorted set. M: # of element returned)

list

objects

scores

Page 8: Session Control  @ nolinux day

Flask

> micro-framework for python

> builtin server

> RESTful request dispatching

> WSGI compliant

> integrated support for unit testing

Page 9: Session Control  @ nolinux day

...... easy .....

code [email protected]('/logout/<username>/<service>/<label>' , methods=['GET'])@jsonp.jsonpdef logout(username, service, label, device_type=None): user.sessions = g.r_server.get('USER:%s:%s:%s' %(username, service, label))) if user.sessions and int(user.sessions) > 0: g.r_server.delete(user.key()) return jsonify({'user': user.to_json(), 'error': messages.OK_NO_ERROR}) return jsonify({'error': messages.NOT_LOGGEDIN_ERROR, 'user': user.to_json()})

Page 10: Session Control  @ nolinux day

..... siac .... api .....

/chack_access/EntroBol04/QOL/<fingerprint>

MMMD5 ( browser capabilities + browser plugins )

cf4ceeb4398b80132eeceadea0a2f9ee

/logout/EntroBol04/QOL/<fingerprint>

Page 11: Session Control  @ nolinux day

headache

> does redis scale ?

> which is the failover policy ?

> what about clustering ?

Page 12: Session Control  @ nolinux day

my early prototype .......

SIAC

REDISMASTER

REDISSLAVE

Page 13: Session Control  @ nolinux day

spreecast http://www.spreecast.com/

Page 14: Session Control  @ nolinux day

Apache ZooKeeper

Centralized service for maintaining:configuration information, naming, distributed synchronization

Page 15: Session Control  @ nolinux day

.. the final solution .. <3 production

Redis

Redis Redis

SIAC SIAC

ZooKeeperCluster Monitor

Monitor

Redis Redis

Page 16: Session Control  @ nolinux day

redis_failover ... for python ...

https://github.com/uolter/redis_failover

Page 17: Session Control  @ nolinux day

....share the code Luke ....

Page 18: Session Control  @ nolinux day

continuous integration as a service

Page 19: Session Control  @ nolinux day

want to learn more ....

> Redis: http://redis.io> Video redis: http://vimeo.com/21539227> Flask: http://flask.pocoo.org> Spreecast & Redis Failover: http://engineering.speecast.com/spreecast-redis-failover> ZooKeeper: http://zookeeper.apache.org

Page 20: Session Control  @ nolinux day

Walter Traspadini http://bit.ly/uolter @uollter