免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: gm3000
打印 上一主题 下一主题

一个python做的服务端软件的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-07-13 19:11 |只看该作者
原帖由 chrisyan 于 2009-7-13 13:23 发表
使用twisted的defer,把 操作串起来
client会24小时不间断传数据吗?那样的话迟早也是不行的,不过这样的情况下twisted应该会帮你处理一部分东西,你测试一下吧
缓存几次查询一并向数据库请求会不会快一点呢?


我尝试了再开几个线程,并且把数据库迁到另外一台机子上,并发写数据库,性能提高了一些,我只能说提高了一些,而且有不稳定的情况,有时候队列累积很快,有时候又基本没有累积...

不过数据库性能感觉提升了一些

另外,twisted只用来接受数据,写数据库是在另外一个线程里做,所以用不了defer,因为defer依赖于reactor来操作,所以...没办法这么做

论坛徽章:
0
12 [报告]
发表于 2009-07-13 19:17 |只看该作者
client端不是24小时都在大量请求,只是高峰期,根据之前的换算,高峰期1000个用户1分钟就会在内存积累超过2G的数据....
这肯定不行....
所以必须提高第二步的性能,关键应该在写数据库性能,和DBA商量后,觉得oracle在处理一次操作最快就在10ms上下,这样算来和接受数据部分的微秒级还是相差比较大啊...

论坛徽章:
0
13 [报告]
发表于 2009-07-13 19:41 |只看该作者
原帖由 ua 于 2009-7-13 16:30 发表
把客户端数据先写入文本文件,再用数据库本身的导入导出工具放入到数据库中,这样能解决数据存储的问题


sqlldr? 可是我的表有关联,行么?并且还有主键,需要插入时定好,sqlldr能做么?而且还有clob字段....

[ 本帖最后由 gm3000 于 2009-7-13 19:43 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2009-07-13 22:07 |只看该作者
参考tcp的设计,是接收端指定窗口(简单理解为发送速率),而不是发送端

既然不是24小时大量请求,就可以考虑设计异步处理了

论坛徽章:
0
15 [报告]
发表于 2009-07-14 15:15 |只看该作者
原帖由 gm3000 于 2009-7-13 19:41 发表


sqlldr? 可是我的表有关联,行么?并且还有主键,需要插入时定好,sqlldr能做么?而且还有clob字段....



你先把原始数据放进去,再起一个进程处理数据,这样数据库就能做一个简单的缓冲,如果按照你目前的设计来说,客户端不知道什么时刻就能把你的服务器给弄死了

论坛徽章:
0
16 [报告]
发表于 2009-07-14 15:19 |只看该作者
如果不想用你的业务数据库,可以用一个内存数据库,像sqllite那种,

论坛徽章:
0
17 [报告]
发表于 2009-07-19 15:45 |只看该作者
我想可以这样不:配置多个队列,每个队列对应一个数据库操作线程,然后接收到数据,放到其中一个队列中去,
如果队列都满了,让client等吧,如果瓶颈还在后端,可以对一个队列多开几个线程处理。


不知道这样设计可行不拿?

论坛徽章:
0
18 [报告]
发表于 2009-07-20 10:00 |只看该作者
原帖由 gm3000 于 2009-7-13 19:11 发表


我尝试了再开几个线程,并且把数据库迁到另外一台机子上,并发写数据库,性能提高了一些,我只能说提高了一些,而且有不稳定的情况,有时候队列累积很快,有时候又基本没有累积...

不过数据库性能感觉提 ...


defer怎么可能不能和thread配合使用呢?用queue啊
比如下面

def after_db_operation(return_value_from_db_operation):
     ....

def submit_to_db(data):
     #你必须能在这访问到queue,我们假设这个就是叫 data_queue
     d = defer.Deferred()
     d.addCallback(afer_db_operation) #可能你还需要一个errback,看需要来吧
     data_queuq.put(d.callback,data)

这样就串起来了,当thread拿到一个queue中的数据时,第一个是defer的callback方法(在传入thread处理函数时我们假设形参叫callback_fun),第二个就是client传来的数据,当处理完成后就调用
callback_fun(return_value_from_db_operation)
这样就行了

而且你还可以并发多个数据库线程来读这个queue,这样其实你有了一个内存中的请求缓冲区。不过如果你的请求真是太多的话,最后还是会由于内存不够而崩溃,所以你还是在factory中设置一个最大连接数吧,当protocol实例太多的话直接拒绝掉

论坛徽章:
0
19 [报告]
发表于 2009-07-23 16:02 |只看该作者
timeten
memcached
这二个基本上是你这种类型业务的唯一解决之道。

具体实现不要问我,我是眼高手低派的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP