MQ初品

~用消息来解耦I/O延迟 (powered by rst2S5)

Authors:Zoom.Quiet
URL:http://zoomquiet.org/res/s5/110320-mq-first-taste/

<免责/>

山寨的,非业界公认的,个人体验为基础! 是也乎;-)

参考所有同好行为总结而得

<brief/>

简单想,简单试,简单用... 是也乎;-)

背景

已经有了... 是也乎;-)

SSO

需求

问题是... 是也乎;-)

口令管理

LDAP

问题是... 是也乎;-)
i/logo/LDAPworm.gif

选择

这货忒复杂! 是也乎;-)
i/logo/gosa-logo.png

选择

这货忒依赖! 是也乎;-)
i/snap/chpasswd-2011-03-18_688x420_scrot.png

本质上

也就3个命令 是也乎;-)
i/map/ldap-acl-cil.png

作出來

就复杂了 是也乎;-)
i/map/ldap-acl-web.png

问题

等待 是也乎;-)

SMTP

<brief/>

简单想,简单试,简单用... 是也乎;-)

尝试

没整成... 是也乎;-)

线程

消息吧

立即的... 是也乎;-)

MQ

什么?

当然的... 是也乎;-)
i/foto/MaggiQ.jpg

理解

先进先出... 是也乎;-)

队列

选择

豆聊... 是也乎;-)

beanstalkd

业务流程

加入MQ... 是也乎;-)
i/map/mq-reset-flow_wsd-napkin.png

植入

最终版本的消息抛出... 是也乎;-)
def __zqecho(logtype,matter):
    beanstalk = beanstalkc.Connection(host='127.0.0.1', port=11300,parse_yaml=True)
    beanstalk.use(logtype)
    beanstalk.put(matter)
    beanstalk.close()
    return
  • swallower.py

e.g 首页

测试业务日志.. 是也乎;-)
@route('%s/'%ini.urlprefix)
def index():
    __urlog("INFO","idx++")
    return template('index.tpl',urlprefix=ini.urlprefix)
  • swallower.py

e.g __urlog

日志消息丢出器.. 是也乎;-)
def __urlog(level,msg):
    urlmsg = "%.4f|%s|%s"%(time.time(),level,msg)
    __zqecho("LOG"
        ,base64.urlsafe_b64encode(urlmsg)
        )
  • swallower.py

swallower.py

吞食者... 是也乎;-)
while True:
    job = beanstalk.reserve()
    if "LOG" == job.stats()['tube']:
        __rlog(beanstalk,job)
    elif "MAIL" == job.stats()['tube']:
        __mail(beanstalk,job)
  • swallower.py

__mail()

在用的邮件书记員... 是也乎;-)
def __mail(beanstalk,job):
    body = base64.urlsafe_b64decode(job.body)
    minfo = eval(body)
    if 'local' == minfo['smtp_type']:
        from plugins.smtploc import mail
    eles:
        from plugins.smtpgml import mail
    job.delete()
  • swallower.py

<brief/>

简单想,简单试,简单用... 是也乎;-)

时间消耗:初期

集中力哪! 是也乎;-)

时间消耗:引入MQ

集中力哪! 是也乎;-)

时间消耗:重构

集中力哪! 是也乎;-)

配置

.ini;.py;内置字典;YAML;... 是也乎;-)
class Borg():
    __collective_mind = {}
    def __init__(self):
        self.__dict__ = self.__collective_mind
    # ...< <configures> >
ini = Borg()

过期

BDB很爽的NoSQL... 是也乎;-)
#... overdue     = 73728
hashed = db[linkback].split(",")
if ini.overdue < int(time.time())-int(hashed[0]):
    __redirect("Overdue",ini.msgTPLoverdue)
# else: ...

配合的

BDB很爽的NoSQL... 是也乎;-)
def __bdburl(mailink):
    db = bdb.btopen(ini.todaydb, 'c')
    urlink = "%s,%s"%(int(time.time()),mailink)
    urlkey = hashlib.sha224(urlink).hexdigest()
    db[urlkey] = urlink
    return urlkey

Supervisor

好用的进程远程管理服务... 是也乎;-)
supervisord

Bottle的模板

简洁,有包含,可用!... 是也乎;-)
%include header title='notify@ '

<h2>== notify @ <a href="{{urlprefix}}/">
    lpasswd.py</a> ==</h2>
<p>{{alert}}::</p>

%include footer4notify

TODO

集中力哪! 是也乎;-)

<brief/>

简单想,简单试,简单用... 是也乎;-)

总之

期望记住的~单位时间能记住的只有7+-2 个 是也乎;-)

<discuss/>

是也乎;-)

Q&A

...

http://zoomquiet.org/res/s5/110311-why-km

最后...

好书推荐... 是也乎;-)
番茄工作法图解

最后的最后...

好书推荐... 是也乎;-)
讲演之禅

<版本/>

是也乎;-)
反馈:Zoom.Quiet@gmail.com
查阅:http://zoomquiet.org/res/s5/110320-mq-first-taste/

S5

纯HTML 幻灯撰写框架!... lr_s5
  • 仅仅依靠 CSS+JS 的HTML格式幻灯演示框架
pix/2010-01-18-230729_605x421_leo.png

<Zoom.Quiet/>

本命+1,有娃没车,长年大妈 是也乎;-)
是也乎,是也乎