采用asyncore进行实时同步

最近在维护项目的时候,发现某个实时数据同步功能非常容易失败,故静下心来彻底弄清楚该设计的实现原理,以及其中用到的python异步sockethandler : asyncore。

实时数据同步功能的设计非常简单,用户在网页上触发某个记录的"Sync Up" button, 后台把该记录的id和type传入asyncore Client,asyncore Client把信息传入asyncore server,asyncore server端调用响应的同步数据API,进行同步,并把同步的数据信息(包括同步过程的log)写入数据库;同时在click button的时候,会开一个循环的ajax call,不断请求数据库,获取存入的实时同步log信息,把log信息打印到页面上。

asyncore Client:

class Client(asyncore.dispatcher_with_send):
    def __init__(self, host, port, message):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect((host, port))
        self.out_buffer = message
        self.response   = ‘‘

    def handle_close(self):
        self.close()

    def handle_read(self):
        self.response = self.recv(1024)
        self.close()

def send(command):
   c = Client(‘127.0.0.1‘, 8081, command)
   asyncore.loop()
   return c.response

if __name__ == ‘__main__‘:
   send(‘quit‘)

asyncore server

class asyncoreServer(asyncore.dispatcher):

    def __init__(self, address, handlerClass=ServerHandler):
        print ">>> Server Socket init with address:%s:%s" % (address[0], address[1])
        self.address            = address
        self.handlerClass       = handlerClass
        self.address_family = socket.AF_INET
        self.socket_type = socket.SOCK_STREAM
        self.request_queue_size = 5
        self.allow_reuse_address = True

        asyncore.dispatcher.__init__(self)
        self.create_socket(self.address_family,self.socket_type)

        if self.allow_reuse_address:
            self.set_reuse_addr()

        self.server_bind()
        self.server_activate()

    def server_bind(self):
        self.bind(self.address)
        log.debug("bind: address=%s:%s" % (self.address[0], self.address[1]))
        print ">>> Begin bind server"

    def server_activate(self):
        self.listen(self.request_queue_size)
        log.debug("listen: backlog=%d" % self.request_queue_size)

    def fileno(self):
        return self.socket.fileno()

    def serve_forever(self):
        asyncore.loop()

    def handle_accept(self):
        (conn_sock, client_address) = self.accept()
        print "Receive Client request socket=%s, client_address=%s:%s" % (conn_sock, client_address[0], client_address[1])
        if self.verify_request(conn_sock, client_address):
           self.process_request(conn_sock, client_address)

    def verify_request(self, conn_sock, client_address):
        return True

    def process_request(self, conn_sock, client_address):
        log.info("conn_made: client_address=%s:%s" % (client_address[0],client_address[1]))
        self.handlerClass(conn_sock, client_address, self)

    def handle_close(self):
        self.close()

关于asyncore的介绍:

asyncore库是python的一个标准库,它是一个异步socket的包装。

asyncore提供一个方法和一个基类:loop()方法和dispatcher基类。

每一个继承dispatcher的类的对象,都可以看做一个需要处理的Socket,可以是TCP也可以是UDP,子类override一些dispatcher的方法,主要是重写handle_打头的方法,比如:

handle_connect, handle_close,  handle_read, handle_write ...

loop()方法负责检查一个dict, dict中保存dispatcher的实例,这个字典被称为channel。每次创建一个dispatcher对象,都会把自己加入到一个默认的dict里面去(当然也可以自己指定channel)。当对象被加入到channel中的时候,socket的行为都已经被定义好,程序只需要调用loop(),一切功能就实现了。

reference:

https://docs.python.org/2/library/asyncore.html

时间: 2024-10-12 23:56:54

采用asyncore进行实时同步的相关文章

用lsyncd和rsyncd实现无ssh支持的文件实时同步

文件存储与同步的基本讨论 网站发展到一定阶段,有时需要将各服务器上传的文件进行集中,这里讨论如果集中的问题,至于如果分散负载均衡.CDN加速.多主机.多域名等blablabla,概不讨论. 集中共享的方案(环境以CentOS 6.5为例)通常的作法是文件同步.共享硬盘空间.硬件堆叠和分布式文件存储四种. 文件同步是用工具定时或自动将分散的文件同步到一个集中的存储区域,如cron配合ftp.ssh.rsync等实现定时同步: 共享空间的做法是用文件存储协议实现挂载和管理,如mount.samba.

sersync基于rsync+inotify实现数据实时同步

一.环境描述 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 主服务器A:192.168.1.23 从服务器B:192.168.1.243 实时同步/var/atlassian目录到从服务器. 二.实施 1.从服务器192.168.1.243 rsync服务搭建 1.1安装软件包 wget http://rsync.samba.org/ftp/rsync/src/rsync-3.1.1.tar.gz tar xf r

烂泥:rsync与inotify集成实现数据实时同步更新

本文首发于烂泥行天下. 上篇文章我们介绍了如何使用rsync同步文件,这篇文章我们再来介绍下,如何把rsync与inotify集成实现数据的实时同步. 要达到这个目的,我们需要分以下几个步骤: 1.rsync的优点与不足 2.inotify是什么 3.检测OS是否支持inotify 4.inotify相关参数详解 5.inotify监控的文件事件类似 6.inotify-tools是什么 7.安装inotify-tools 8.inotifywait使用详解 9.inotifywatch使用详解

企业实时同步方案----Rsync+Sersync

在博文企业实时同步方案----Sersync介绍中我们详细介绍了Sersync的原理,设计架构以及和 Inotify 等等的优势区别.这里我就带大家一起来做一下 Rsync +Sersync 这个同步分发架构案例. 实验环境介绍: 内核版本:2.6.32-431.el6.x86_64 系统采用最小化安装,系统经过了基本优化,selinux为关闭状态,iptables为无限制模式 源码包存放位置:/root Rsync客户端+Sersync服务器(SERSYNC),承担角色MASTER,IP:17

lsyncd 实时同步

1. 几大实时同步工具比较 1.1 inotify + rsync 最近一直在寻求生产服务服务器上的同步替代方案,原先使用的是inotify + rsync,但随着文件数量的增大到100W+,目录下的文件列表就达20M,在网络状况不佳或者限速的情况下,变更的文件可能10来个才几M,却因此要发送的文件列表就达20M,严重减低的带宽的使用效率以及同步效率:更为要紧的是,加入inotifywait在5s内监控到10个小文件发生变化,便会触发10个rsync同步操作,结果就是真正需要传输的才2-3M的文

linux下两台服务器文件实时同步方案设计和实现

转:http://blog.csdn.net/5iasp/article/details/13630927 假设有如下需求: 假设两个服务器: 192.168.0.1 源服务器  有目录 /opt/test/ 192.168.0.2 目标服务器  有目录 /opt/bak/test/ 实现的目的就是保持这两个服务器某个文件目录保持实时同步 实现方式: 通过rsync+inotify-tools结合来实现 需要安装软件: 1.  rsync 同步软件 在 源服务器 和 目标服务器 都需要安装 源服

linux主从实时同步

linux主从同步,目前广泛采用的方案是使用rsync+inotify的方式来实现文件的触发更新.原理是采用inotify来对文件进行监控,当监控到文件有文件发生改变的时候,就会调用rsync实现触发式实时同步.我采用的是金山的一个居于inotify+rsync进行二次开发实现文件同步的小工具sersync,能够很方便的实现文件触发式同步,所以本文采用的rsync+sersync. 下面的对于inotify的简介都引自 http://blog.chinaunix.net/uid-20639775

通过rsync+inotify-tools+ssh实现触发式远程实时同步

文件的同步镜像在很多地方都需要用到,因此rsync这款免费软件得到了广泛的应用,包括在Windows平台上,都已经有了支持rsync的"cwRsyncServer".但是,我们一般都是通过结合crontab计划任务来实现文件同步的,这样做的缺点是效率低,不能做到实时同步.现在,在Linux平台下我们可以利用2.6内核的inotify监控文件系统机制,通过inotify-tools来实现实时同步了.具体操作如下: 1.安装所需软件目前各大Linux发行版本都已经具有了rsync与inot

rsync与inotify集成实现数据实时同步更新

本文转载:http://ilanni.blog.51cto.com/526870/1605200 把rsync与inotify集成实现数据的实时同步. 要达到这个目的,我们需要分以下几个步骤: 1.rsync的优点与不足 2.inotify是什么 3.检测OS是否支持inotify 4.inotify相关参数详解 5.inotify监控的文件事件类似 6.inotify-tools是什么 7.安装inotify-tools 8.inotifywait使用详解 9.inotifywatch使用详解