Cookie server 性能优化实践(上)

简介: Cookie server 性能优化实践

背景

上图描述的是一般的服务器的模型,即:由主线程作为 server 端,负责接收所有到来的请求,并将请求封装为新的对象放入阻塞队列中。由线程池中的一系列工作线程对请求的业务进行处理(可能包括磁盘读写的操作),最后返回处理结果。Memcached 服务端也是采用类似的架构。

看起来上面的架构相当合理,但是仔细看来,其实里面大有可优化之处。下面是阻塞队列:

线程池中的线程数目毕竟有限,假设只有四条线程轮询上面的阻塞队列,然后分别处理四条请求 R1R4。当 R1R4 都需要进行磁盘操作时此时问题就出现了。假设 R5 请求不需要进行磁盘操作,甚至可以很快处理完成。但是即使线程池里的线程都在等待 I/O 完成而“空闲”下来,后面的请求依然得不到处理。由此可见,消除磁盘 I/O 请求阻塞非磁盘请求可以优化请求的平均处理时间,提高服务器的性能。

后面将陆续更新三种优化方法,当然三种方法全部依托于 twisted 框架。

异步网络调用

一个真正达到性能优化服务器,还是需要我们在程序中真正良好的去应用 Twisted 的各种工具的。  最常见的情况就是我们将一个非阻塞的应用中,加入了长时间的处理过程,从而达到了阻塞的效果,从而让大家都因为一位同志的长时工作而等待。

先来看看下面的这段代码:

from twisted.internet import protocol, reactor
from twisted.protocols import basic
class FingerProtocol(basic.LineReceiver):
    def lineReceived(self, user):
        self.transport.write(self.factory.getUser(user)+"\r\n")
        self.transport.loseConnection()
class FingerFactory(protocol.ServerFactory):
    protocol = FingerProtocol
    def __init__(self, **kwargs): self.users = kwargs
    def getUser(self, user):
        return self.users.get(user, "No such user")
reactor.listenTCP(1079, FingerFactory(hd='Hello my python world'))
reactor.run()

它可能是我们所写的第一个 Twisted 服务器。可能所有人都会认为这样的操作已经不会有什么问题了。但是显然,在这里我们的 getUser 更多的情况下可能会是从数据库中或是 LDAP 服务器上获取相关的信息。哪么最好的处理就是将 get 操作以非即时方式返回,以避免发生处理的阻塞。哪么就需要使用 Deferreds 了:

from twisted.internet import protocol, reactor, defer
from twisted.protocols import basic
class FingerProtocol(basic.LineReceiver):
    def lineReceived(self, user):
        self.factory.getUser(user
        ).addErrback(lambda _: "Internal error in server"
        ).addCallback(lambda m:
                      (self.transport.write(m+"\r\n"),
                       self.transport.loseConnection()))
class FingerFactory(protocol.ServerFactory):
    protocol = FingerProtocol
    def __init__(self, **kwargs): self.users = kwargs
    def getUser(self, user):
        return defer.succeed(self.users.get(user, "No such user"))
reactor.listenTCP(1079, FingerFactory(hd='Hello my python world'))
reactor.run()

这里 getUser 返回的是 defer 处理过的一个事务,而 addCallback 方法注册了 defer 中处理完成后的返回事件。这样,事务的处理就可以在另一个事件可调度的情况下进行了。从而避免了因一个用户的处理阻塞的情况下,让所有的用户都停止了响应。

目录
相关文章
|
7月前
|
存储 前端开发 搜索推荐
12:会话跟踪技术Cookie的深度应用与实践-Java Web
12:会话跟踪技术Cookie的深度应用与实践-Java Web
119 4
|
网络协议 Java Go
Cookie server 性能优化实践(下)
Cookie server 性能优化实践(下)
81 0
|
1月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
60 4
|
1月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
2月前
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
190 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
|
2月前
|
存储 安全 数据安全/隐私保护
Cookie 和 Session 的区别及使用 Session 进行身份验证的方法
【10月更文挑战第12天】总之,Cookie 和 Session 各有特点,在不同的场景中发挥着不同的作用。使用 Session 进行身份验证是常见的做法,通过合理的设计和管理,可以确保用户身份的安全和可靠验证。
26 1
|
3月前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
|
3月前
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
3月前
|
存储 安全 NoSQL
Cookie、Session、Token 解析
Cookie、Session、Token 解析
65 0