关于Netty和Tomcat处理HTTP请求的问题

benluobo 2016-08-12 10:02:42
最近在看Netty的时候说 当Netty收到一个连接后,会分配一个EventLoop去处理这个连接,负责这个连接的整个生命周期,也就是对于一个连接,都是某个固定的线程去处理这个连接的所有请求

想到tomcat的BIO实现方式,有几个问题

因为tomcat是一个请求,一个线程,是否是如果有一个连接有N次请求,负责处理这N次请求的线程都是重新从线程池拿的?也就是说每次处理这个连接请求的线程很有可能是不一样的?那是否是说在Netty中的EventLoop线程中是可以有线程变量的,而tomcat肯定是不行的?
...全文
562 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
skgary 2016-08-12
  • 打赏
  • 举报
回复
引用 4 楼 viszl 的回复:
[quote=引用 3 楼 skgary 的回复:] [quote=引用 2 楼 viszl 的回复:] 你的问题没有看清楚,tomcat一个请求就是一个线程,你说的连接是什么,是指一个session里有多个请求,希望这些请求都从线程池里拿同一个线程吗?这种场景下就不能用threadlocal来共享数据了,因为一个session里请求是不一样的线程,建议通过jsessionid维护共享数据,或者通过spring session scope的bean来共享数据
session,连接和请求这几者是没有必然的联系的。 如果是代理服务器的话,有可能一个连接跨几个session。 也就是说,一个连接上的请求,会来自于几个不同的 session. [/quote] 你说的连接是什么啊,我一直没看明白[/quote] tcp 的连接。 http 1.1是长连接的,可以在一个连接上发送多个http 请求。 而session是用cookie来标识的,所以,一个连接上的多个请求未必是同一个session的。
loveofmylife 2016-08-12
  • 打赏
  • 举报
回复
引用 5 楼 benluobobo 的回复:
这个场景 通过浏览器连接Web服务,顺序发送多个请求 如果Web服务是用Tomcat实现,那肯定是多个不同的线程去处理这多个请求 如果Web服务是用Netty实现,那就是一个线程(EventLoop)去处理这多个请求 这个说法对不对?
Netty 不懂,tomcat是这样
benluobo 2016-08-12
  • 打赏
  • 举报
回复
也就是说在tomcat中,线程只是对应请求,而跟发送请求的客户端连接是无关的?
benluobo 2016-08-12
  • 打赏
  • 举报
回复
这个场景 通过浏览器连接Web服务,顺序发送多个请求 如果Web服务是用Tomcat实现,那肯定是多个不同的线程去处理这多个请求 如果Web服务是用Netty实现,那就是一个线程(EventLoop)去处理这多个请求 这个说法对不对?
loveofmylife 2016-08-12
  • 打赏
  • 举报
回复
引用 3 楼 skgary 的回复:
[quote=引用 2 楼 viszl 的回复:] 你的问题没有看清楚,tomcat一个请求就是一个线程,你说的连接是什么,是指一个session里有多个请求,希望这些请求都从线程池里拿同一个线程吗?这种场景下就不能用threadlocal来共享数据了,因为一个session里请求是不一样的线程,建议通过jsessionid维护共享数据,或者通过spring session scope的bean来共享数据
session,连接和请求这几者是没有必然的联系的。 如果是代理服务器的话,有可能一个连接跨几个session。 也就是说,一个连接上的请求,会来自于几个不同的 session. [/quote] 你说的连接是什么啊,我一直没看明白
skgary 2016-08-12
  • 打赏
  • 举报
回复
引用 2 楼 viszl 的回复:
你的问题没有看清楚,tomcat一个请求就是一个线程,你说的连接是什么,是指一个session里有多个请求,希望这些请求都从线程池里拿同一个线程吗?这种场景下就不能用threadlocal来共享数据了,因为一个session里请求是不一样的线程,建议通过jsessionid维护共享数据,或者通过spring session scope的bean来共享数据
session,连接和请求这几者是没有必然的联系的。 如果是代理服务器的话,有可能一个连接跨几个session。 也就是说,一个连接上的请求,会来自于几个不同的 session.
loveofmylife 2016-08-12
  • 打赏
  • 举报
回复
你的问题没有看清楚,tomcat一个请求就是一个线程,你说的连接是什么,是指一个session里有多个请求,希望这些请求都从线程池里拿同一个线程吗?这种场景下就不能用threadlocal来共享数据了,因为一个session里请求是不一样的线程,建议通过jsessionid维护共享数据,或者通过spring session scope的bean来共享数据
loveofmylife 2016-08-12
  • 打赏
  • 举报
回复
tomcat中每次请求结束都要手动清空threadlocal,不然会被其他请求重用
skgary 2016-08-12
  • 打赏
  • 举报
回复
昏死,楼主说的是netty和tomcat .... 我看成jetty和tomcat ...

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧