关于Web应用负载均衡及数据共享的几个问题

ilove581314 2014-08-03 08:58:30
我想对web应用进行负载均衡,有一些问题想请教:
1. 几个web应用是不是连接同一个数据库?
2. 比如我的应用中有秒杀活动,商品的份数是一定的,绝对不能超支,那这几个web应用中应该如何进行数据同步的控制??
3. 应用中有一些数据统计和处理的操作,比如从某张表中查询某些信息,统计以及相关操作后就删掉了,那又怎么控制这几个应用不会相互影响呢?我对这个问题的想法是:关于数据处理的部分是可以独立出来的,单独跑,不和用户业务逻辑处理放在一起。不知道大家有什么别的思路。
4. 在没有用负载均衡之前,我用了一些static静态缓存,很方便,但负载均衡之后就不能用static静态缓存了,有没有一些好的缓存技术可以推荐,服务端用的,MemCache?JSC?可以多个应用同时使用并且能保证其中任何一个应用更新之后,其他应用都能及时收到最新的缓存。

谢谢大家!!
...全文
720 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
pricks 2014-08-06
  • 打赏
  • 举报
回复
引用 1 楼 ldh911 的回复:
[quote=引用 楼主 ilove581314 的回复:] 我想对web应用进行负载均衡,有一些问题想请教:
按一般性做法回答你: 1. 几个web应用是不是连接同一个数据库? —— 是!分库设计是另一个高度的事情了。 2. 比如我的应用中有秒杀活动,商品的份数是一定的,绝对不能超支,那这几个web应用中应该如何进行数据同步的控制?? —— Web应用跟服务端一般来说是两个层面的东西;秒杀功能本身应该是独立服务端应用,由秒杀服务端进行独立处理,然后批量回写数据库。 —— 秒杀服务端考虑采用队列方式接收处理请求,极端情况下每个商品一个队列,每个队列有专门的单个服务器提供服务。如该服务崩溃,新的服务线程接管该队列处理,重新来过。 —— 可限制队列长度(如商品可秒杀数量×120%),超过长度的直接抛弃。[/quote] 对第2点,如果这样设计,估计得自己写个专门的组件了。例如:如果某个服务崩溃,让新的服务线程接管。这得有全局调度器,调度器得追踪各个任务是否崩溃……
skgary 2014-08-05
  • 打赏
  • 举报
回复
第四个问题,如果用了memcache,显然memcache是按key 进行分布式缓存(如果有必要的话);否则的话,系统中就只有一个mem cache.
skgary 2014-08-05
  • 打赏
  • 举报
回复
第二个问题 秒杀服务独立的原因就是为了避免服务器之间的同步与交互。这样很多变量就可以直接存在内存里,而不用存到数据库中,也不用考虑cache的有效性。反正把你要的东西全存内存,把关键的交易数据存在本地盘。可以减少很多很多不必要的麻烦 。
ilove581314 2014-08-05
  • 打赏
  • 举报
回复
引用 1 楼 ldh911 的回复:
[quote=引用 楼主 ilove581314 的回复:] 我想对web应用进行负载均衡,有一些问题想请教:
按一般性做法回答你: 1. 几个web应用是不是连接同一个数据库? —— 是!分库设计是另一个高度的事情了。 2. 比如我的应用中有秒杀活动,商品的份数是一定的,绝对不能超支,那这几个web应用中应该如何进行数据同步的控制?? —— Web应用跟服务端一般来说是两个层面的东西;秒杀功能本身应该是独立服务端应用,由秒杀服务端进行独立处理,然后批量回写数据库。 —— 秒杀服务端考虑采用队列方式接收处理请求,极端情况下每个商品一个队列,每个队列有专门的单个服务器提供服务。如该服务崩溃,新的服务线程接管该队列处理,重新来过。 —— 可限制队列长度(如商品可秒杀数量×120%),超过长度的直接抛弃。 3. 应用中有一些数据统计和处理的操作,比如从某张表中查询某些信息,统计以及相关操作后就删掉了,那又怎么控制这几个应用不会相互影响呢?我对这个问题的想法是:关于数据处理的部分是可以独立出来的,单独跑,不和用户业务逻辑处理放在一起。不知道大家有什么别的思路。 —— 有策略问题,最简单的策略就是:全部依赖数据库(无缓存); —— 面临更高并发要求时,就要权衡代价,1是牺牲一定的即时性(资讯发布类多为这种);2是使用带同步机制的缓存(要注意同步是有代价的)。 4. 在没有用负载均衡之前,我用了一些static静态缓存,很方便,但负载均衡之后就不能用static静态缓存了,有没有一些好的缓存技术可以推荐,服务端用的,MemCache?JSC?可以多个应用同时使用并且能保证其中任何一个应用更新之后,其他应用都能及时收到最新的缓存。 —— 首先尽量区分缓存的类型,第一级别的是可以直接HTML化的,这类通过Ngnix+磁盘共享来解决; —— 应用级缓存主要是靠MemCache这类支持同步机制的解决; —— 此外还有内存数据库; —— 最后才是数据库级别。[/quote] 非常感谢您的回答,还想进一步请教您一些问题, 对于第二个问题,您的意思就是秒杀服务端是独立的?不能使用负载均衡,即不能负载均衡中的每个应用都可以接收请求?? 对于第三个问题的第一个回答,全部依赖数据库就不会产生问题了吗?比如:负载均衡中的多个应用可能同时查出相同的数据进行处理然后删除。 对于第四个怪问题,MemCache这类缓存技术,我想问的是:它支持负载均衡中的多个应用同时操作的同步机制吗? 谢谢!!
MiceRice 2014-08-05
  • 打赏
  • 举报
回复
引用 楼主 ilove581314 的回复:
我想对web应用进行负载均衡,有一些问题想请教:
按一般性做法回答你: 1. 几个web应用是不是连接同一个数据库? —— 是!分库设计是另一个高度的事情了。 2. 比如我的应用中有秒杀活动,商品的份数是一定的,绝对不能超支,那这几个web应用中应该如何进行数据同步的控制?? —— Web应用跟服务端一般来说是两个层面的东西;秒杀功能本身应该是独立服务端应用,由秒杀服务端进行独立处理,然后批量回写数据库。 —— 秒杀服务端考虑采用队列方式接收处理请求,极端情况下每个商品一个队列,每个队列有专门的单个服务器提供服务。如该服务崩溃,新的服务线程接管该队列处理,重新来过。 —— 可限制队列长度(如商品可秒杀数量×120%),超过长度的直接抛弃。 3. 应用中有一些数据统计和处理的操作,比如从某张表中查询某些信息,统计以及相关操作后就删掉了,那又怎么控制这几个应用不会相互影响呢?我对这个问题的想法是:关于数据处理的部分是可以独立出来的,单独跑,不和用户业务逻辑处理放在一起。不知道大家有什么别的思路。 —— 有策略问题,最简单的策略就是:全部依赖数据库(无缓存); —— 面临更高并发要求时,就要权衡代价,1是牺牲一定的即时性(资讯发布类多为这种);2是使用带同步机制的缓存(要注意同步是有代价的)。 4. 在没有用负载均衡之前,我用了一些static静态缓存,很方便,但负载均衡之后就不能用static静态缓存了,有没有一些好的缓存技术可以推荐,服务端用的,MemCache?JSC?可以多个应用同时使用并且能保证其中任何一个应用更新之后,其他应用都能及时收到最新的缓存。 —— 首先尽量区分缓存的类型,第一级别的是可以直接HTML化的,这类通过Ngnix+磁盘共享来解决; —— 应用级缓存主要是靠MemCache这类支持同步机制的解决; —— 此外还有内存数据库; —— 最后才是数据库级别。
skgary 2014-08-05
  • 打赏
  • 举报
回复
引用 8 楼 ilove581314 的回复:
[quote=引用 4 楼 skgary 的回复:] 第四个问题,如果用了memcache,显然memcache是按key 进行分布式缓存(如果有必要的话);否则的话,系统中就只有一个mem cache.
如果使用MemCache,并且负载均衡中的多个应用所使用的MemCache都存在一个地方(不分布),那么负载均衡中的多个应用如果同时进行 cache.put ("counter", cache.get("counter") +1); 之类的操作,会如何?如果有问题,有什么解决方案?[/quote] 1. 尽可能回避这种操作 2. 这种操作一般都是计数器,牺牲实时性。即每个计数器本地先计,然后再定时写到后面的memcache中 3. 用消息机制汇总再写memcache 最后说一下,不要企图寻找万全的解决方案,那根本不存在。
skgary 2014-08-05
  • 打赏
  • 举报
回复
引用 7 楼 ilove581314 的回复:
[quote=引用 3 楼 skgary 的回复:] 第二个问题 秒杀服务独立的原因就是为了避免服务器之间的同步与交互。这样很多变量就可以直接存在内存里,而不用存到数据库中,也不用考虑cache的有效性。反正把你要的东西全存内存,把关键的交易数据存在本地盘。可以减少很多很多不必要的麻烦 。
那就相当于还是没有用负载均衡……??本来是想着因为请求太多,一个Tomcat处理不过来,才做负载的……[/quote] 只要算法得当,tomcat肯定不会处理不过来。 通常在软件内存中计算的,网络先瓶颈,有没有负载均衡根本无所谓。
ilove581314 2014-08-05
  • 打赏
  • 举报
回复
引用 4 楼 skgary 的回复:
第四个问题,如果用了memcache,显然memcache是按key 进行分布式缓存(如果有必要的话);否则的话,系统中就只有一个mem cache.
如果使用MemCache,并且负载均衡中的多个应用所使用的MemCache都存在一个地方(不分布),那么负载均衡中的多个应用如果同时进行 cache.put ("counter", cache.get("counter") +1); 之类的操作,会如何?如果有问题,有什么解决方案?
ilove581314 2014-08-05
  • 打赏
  • 举报
回复
引用 3 楼 skgary 的回复:
第二个问题 秒杀服务独立的原因就是为了避免服务器之间的同步与交互。这样很多变量就可以直接存在内存里,而不用存到数据库中,也不用考虑cache的有效性。反正把你要的东西全存内存,把关键的交易数据存在本地盘。可以减少很多很多不必要的麻烦 。
那就相当于还是没有用负载均衡……??本来是想着因为请求太多,一个Tomcat处理不过来,才做负载的……
ilove581314 2014-08-05
  • 打赏
  • 举报
回复
引用 5 楼 ldh911 的回复:
[quote=引用 2 楼 ilove581314 的回复:] 还想进一步请教您一些问题,
对于第二个问题,您的意思就是秒杀服务端是独立的?不能使用负载均衡,即不能负载均衡中的每个应用都可以接收请求?? —— 3楼解释的不错。 —— 可以使用复杂均衡。 —— 你的整个应用架构,必须是分层架构,负责接收各种请求的Web服务器,显然是群集的,且需要负载均衡;实际场景可能是:100W个用户在上面秒杀100种商品。 —— 但是后端的各种实际处理业务的服务器,是按业务来分别部署的,比如:提供搜索浏览的是一组、提供商品详细介绍的是一组、提供一般性购买的是一组、提供秒杀的是一组。 —— 这组负责秒杀的服务器,为了短时的超高速处理,就必须最大可能削减并发协调性事务(尤其是跨机器的);所以它可以专门的一个线程去服务某一个商品的所有秒杀请求处理,这样最大可能消除并发的风险和所需的协调时间。 —— 那么刚才也看到了,100W个用户秒杀100种商品,落到具体这个线程,也就是要处理1W个请求。夸张点的说法:请问1个线程执行1W次 i-- 需要多长时间?实际上因为秒杀商品数量有限,根本还不需要实际处理这么多请求,队列中靠后的,直接失败掉就行了。 对于第三个问题的第一个回答,全部依赖数据库就不会产生问题了吗?比如:负载均衡中的多个应用可能同时查出相同的数据进行处理然后删除。 —— 没问题,相当于把所有事务协调工作甩给了数据库,当然你的SQL必须正确。 —— 没有问题,后来发出删除请求的,必然会因为找不到数据可以删除而失败。但业务结果是正确的。这就好比你跟另外10个人看到还有1张车票,马上点进去买,显然除了第一个人能在数据库中占有这张票,其他人都失败了嘛;但业务结果是正确的。 对于第四个怪问题,MemCache这类缓存技术,我想问的是:它支持负载均衡中的多个应用同时操作的同步机制吗? —— 支持。 —— 另,使用了非常良好支持同步机制的组件或系统,不代表你的程序逻辑就能完全不用考虑事务;典型例子就是如果你的代码执行的是: cache.put ("counter", cache.get("counter") +1); 在并发环境下照样结果错误。具体原因相信你自己能理解吧? [/quote] 。。。。。 1. 我的项目是分层,但不是分布式,所有的都在一个项目里。 2. 有可能会出问题吧,比如:负载均衡中的多个应用可能同时查出相同的数据进行处理(不说删除)。 3. 如果使用MemCache,并且负载均衡中的多个应用所使用的MemCache都存在一个地方(不分布),那么负载均衡中的多个应用如果同时进行 cache.put ("counter", cache.get("counter") +1); 之类的操作,会如何?如果有问题,有什么解决方案?
MiceRice 2014-08-05
  • 打赏
  • 举报
回复
引用 2 楼 ilove581314 的回复:
还想进一步请教您一些问题,
对于第二个问题,您的意思就是秒杀服务端是独立的?不能使用负载均衡,即不能负载均衡中的每个应用都可以接收请求?? —— 3楼解释的不错。 —— 可以使用复杂均衡。 —— 你的整个应用架构,必须是分层架构,负责接收各种请求的Web服务器,显然是群集的,且需要负载均衡;实际场景可能是:100W个用户在上面秒杀100种商品。 —— 但是后端的各种实际处理业务的服务器,是按业务来分别部署的,比如:提供搜索浏览的是一组、提供商品详细介绍的是一组、提供一般性购买的是一组、提供秒杀的是一组。 —— 这组负责秒杀的服务器,为了短时的超高速处理,就必须最大可能削减并发协调性事务(尤其是跨机器的);所以它可以专门的一个线程去服务某一个商品的所有秒杀请求处理,这样最大可能消除并发的风险和所需的协调时间。 —— 那么刚才也看到了,100W个用户秒杀100种商品,落到具体这个线程,也就是要处理1W个请求。夸张点的说法:请问1个线程执行1W次 i-- 需要多长时间?实际上因为秒杀商品数量有限,根本还不需要实际处理这么多请求,队列中靠后的,直接失败掉就行了。 对于第三个问题的第一个回答,全部依赖数据库就不会产生问题了吗?比如:负载均衡中的多个应用可能同时查出相同的数据进行处理然后删除。 —— 没问题,相当于把所有事务协调工作甩给了数据库,当然你的SQL必须正确。 —— 没有问题,后来发出删除请求的,必然会因为找不到数据可以删除而失败。但业务结果是正确的。这就好比你跟另外10个人看到还有1张车票,马上点进去买,显然除了第一个人能在数据库中占有这张票,其他人都失败了嘛;但业务结果是正确的。 对于第四个怪问题,MemCache这类缓存技术,我想问的是:它支持负载均衡中的多个应用同时操作的同步机制吗? —— 支持。 —— 另,使用了非常良好支持同步机制的组件或系统,不代表你的程序逻辑就能完全不用考虑事务;典型例子就是如果你的代码执行的是: cache.put ("counter", cache.get("counter") +1); 在并发环境下照样结果错误。具体原因相信你自己能理解吧?

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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