zoukankan      html  css  js  c++  java
  • 高并发请求解决方案

    使用场景:某平台用户搜索(search)-选择商品-下单;

    本公司角色:二级代理商(在香港外包公司取得数据=美国总部一致对外公布的商品信息+香港一级代理商佣金)

    业务处理流程:平台(多个)用户请求-公司请求-外包(美国+一级代理商)结果-公司处理-平台

    业务流程中主要是针对用户搜索(search)带来的高并发处理进行一个记录。

    解决方案:

    LVS+Mencache(独立一台服务器 配置32g内存,liunx)

    LVS分发到四台“服务器”(主要是服务器没有购买下来,用普通的4G内存台式电脑替换);后面服务器买了,把LVS分发去掉,直接处理请求;

    期间把量加大了,公司服务器可以应付过来这么多请求,但是在外包调用返点(webserver)步骤由于并发太大,处理不过来也挂了;

    解决办法

    1,搭建4个webserver站点,轮询访问;

    2,把数据写入缓存(计划)

    改进:

    后台程序跑数据写入缓存

    总结:

    1,由于没有大数据的并发经验,很多方案都不断的尝试,改进再测试再改进;

    2,处理高并发,通过分发,减轻服务器压力;后台程序支持缓存更新;

    关键代码:

    Mencache :

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Web;
      5 using System.Configuration;
      6 using Memcached.ClientLibrary;
      7 
      8 namespace Command.Memcached
      9 {
     10     public class MemcachedInit
     11     {
     12         private static string _memname = "policypool";
     13         private static MemcachedClient _mc = new MemcachedClient();        
     14         private static MemcachedInit _c = new MemcachedInit();
     15         private MemcachedInit() { }
     16 
     17         public static MemcachedInit CurrentMemcached
     18         {
     19             get {
     20                 return _c;
     21             }
     22         }
     23 
     24         public bool DeleteCache(string key)
     25         {
     26             return _mc.Delete(key);
     27         }
     28 
     29         public object GetCache(string key)
     30         {
     31             return _mc.Get(key);
     32         }
     33 
     34         public void SetCache(string key, object obj)
     35         {
     36             _mc.Set(key, obj);
     37         }
     38 
     39         public void SetCache(string key,object obj, DateTime dt)
     40         {
     41             _mc.Set(key, obj, dt);
     42         }
     43 
     44         public bool IsKeyExists(string key)
     45         {
     46             return _mc.KeyExists(key);
     47         }
     48         /// <summary>
     49         /// 增加缓存
     50         /// </summary>
     51         /// <param name="key">Key</param>
     52         /// <param name="obj">Value</param>
     53         /// <param name="min">分钟数</param>
     54         public void SetCache(string key, object obj, int min)
     55         {
     56             _mc.Set(key, obj, DateTime.Now.AddMinutes(min));
     57         }
     58 
     59         public bool FlushAll()
     60         {
     61             return _mc.FlushAll();
     62         }
     63 
     64         public void Init()
     65         {
     66             string[] serverlist = ConfigurationManager.AppSettings["Memcached.ServerList"].Split(',');
     67             //string[] serverlist = { "127.0.0.1:11211" }; //服务器列表,可多个  
     68             try
     69             {
     70                 // 初始化SocketIO池
     71                 string poolName = _memname;
     72                 SockIOPool sockIOPool = SockIOPool.GetInstance(poolName);
     73                 // 添加服务器列表
     74                 sockIOPool.SetServers(serverlist);
     75                 // 设置连接池初始数目
     76                 sockIOPool.InitConnections = 3;
     77                 // 设置连接池最小连接数目
     78                 sockIOPool.MinConnections = 3;
     79                 // 设置连接池最大连接数目
     80                 sockIOPool.MaxConnections = 5;
     81                 // 设置连接的套接字超时时间(单位:毫秒)
     82                 sockIOPool.SocketConnectTimeout = 1000;
     83                 // 设置套接字超时时间(单位:毫秒)
     84                 sockIOPool.SocketTimeout = 3000;
     85                 // 设置维护线程运行的睡眠时间:如果设置为0,那么维护线程将不会启动
     86                 sockIOPool.MaintenanceSleep = 30;
     87                 // 设置SockIO池的故障标志
     88                 sockIOPool.Failover = true;
     89                 // 是否用nagle算法启动
     90                 sockIOPool.Nagle = false;
     91                 // 正式初始化容器
     92                 sockIOPool.Initialize();
     93 
     94                 _mc.PoolName = _memname;                
     95 
     96                 _mc.EnableCompression = false;
     97             }
     98             catch (Exception err)
     99             {
    100                 common.LogUtils.Debug("memcached线程启动失败  "+err.Message);
    101             }
    102         }
    103 
    104     }
    105 }

    轮询遍历webservice

    1                 ServiceSoapClient client = new  ServiceSoapClient();
    2 //ConfigSetting.SearchUrls 存放多个webservice地址
    3                 if (!string.IsNullOrEmpty(ConfigSetting.SearchUrls))
    4                 {
    5                     client.Endpoint.Address = new System.ServiceModel.EndpointAddress(GetRandomUrl());
    6                 }
    1         private string GetRandomUrl()
    2         {
    3             string[] _urls = Regex.Split(ConfigSetting.SearchUrls, ",");
    4             Random _r = new Random();
    5             int rint = _r.Next(0, 25 * _urls.Length - 1);
    6             return _urls[rint % _urls.Length];
    7         }

    附图:

  • 相关阅读:
    产生随机不重复ID
    .NET 中使用 SQlite 数据库_1.新数据库的创建
    WCF 服务IIS部署 SvcUtil.exe 工具文件地址 及 生成代理类命令
    查看进程占用各字段含义
    内存溢出
    Python 正则表达式使用问题集锦
    Ninja编译过程分析
    git 命令使用集锦
    使用aapt查看当前apk的属性
    Android PowerManager电源管理(Android N )
  • 原文地址:https://www.cnblogs.com/systemkk/p/4789297.html
Copyright © 2011-2022 走看看