netcore 3.1を用いて簡単な商品秒殺活動を実現する(一)
文書ディレクトリ1、説明 2、インターフェース 3、シミュレータ 1、説明
このプロジェクトは簡単なシミュレーションの試みに用いられ,後期には実際の秒殺活動を改善し,論理をより深くより密にする.
2、インタフェース
インタフェースも単純にメモリに商品を挿入するだけで、実際にはRedisに書き込むことを考慮します.
3、シミュレータ
コンカレント要求インタフェース
后でできるだけ早く改善して更に実际の秒杀の活动に切り込んで、捜索によって秒杀の活动の原理を理解して、自分で先に简単な试みを行って、大物が见る时またよろしくお愿いします
このプロジェクトは簡単なシミュレーションの試みに用いられ,後期には実際の秒殺活動を改善し,論理をより深くより密にする.
2、インタフェース
インタフェースも単純にメモリに商品を挿入するだけで、実際にはRedisに書き込むことを考慮します.
[Route("api/[controller]/[action]")]
[ApiController]
public class OrderController : ControllerBase
{
private readonly IHttpContextAccessor _httpContext;
public OrderController(IHttpContextAccessor httpContext)
{
_httpContext = httpContext;
}
// redis
private static IDictionary _product = new Dictionary();
///
///
///
///
///
[HttpPost]
public IActionResult Buy([FromBody]Product product)
{
//
var user = _httpContext.HttpContext.Request.Headers["Client-Remote-User"].ToString();
// 100
if (_product.Count == 100)
{
return Ok(new AjaxRepsone(3));
}
if (_product.Keys.Contains(user))
{
return Ok(new AjaxRepsone(2));
}
// redis
_product.Add(user, product);
return Ok(new AjaxRepsone(1));
}
class AjaxRepsone
{
public AjaxRepsone()
{
Success = true;
}
public AjaxRepsone(int type)
{
Type = type;
}
///
/// 1- ,2- ,3-
///
public int Type { get; set; }
public bool Success { get; set; }
}
}
3、シミュレータ
コンカレント要求インタフェース
class Program
{
[STAThread]
static void Main(string[] args)
{
// 10
Thread.Sleep(TimeSpan.FromSeconds(3));
var build = new HostBuilder()
.ConfigureServices((hostContext, service) =>
{
service.AddHttpClient();
//
//service.AddTransient();
}).UseConsoleLifetime(options =>
{
options.SuppressStatusMessages = true;
});
var host = build.Build();
var api = "http://localhost:5000/api/Order/Buy";
var now = DateTime.Now;
using (var serviceScope = host.Services.CreateScope())
{
var service = serviceScope.ServiceProvider;
try
{
// , ,
var httpClient = service.GetRequiredService();
var client = httpClient.CreateClient("test");
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
var content = new HttpRequestMessage(HttpMethod.Post, new Uri(api));
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};
// , 0
var flag = 0;
// 5W , OPS、TPS
for (int i = 1; i <= 5 * 1000; i++)
{
if (flag == 1)
{
break;
}
content.Headers.Clear();
//content.Headers.Add("Client-Remote-Any", Guid.NewGuid().ToString("N").ToUpper());
content = new HttpRequestMessage(HttpMethod.Post, new Uri(api));
var json = JsonSerializer.Serialize(new
{
Id = i,
Name = "",
Price = 9900d,
XingHao = "Y9000X",
Describle = "lenov"
});
var user = Guid.NewGuid().ToString("N").ToUpper();
content.Content = new StringContent(json, Encoding.UTF8, "application/json");
content.Content.Headers.TryAddWithoutValidation("Client-Remote-User", user);
var response = client.PostAsync(api, content.Content);
//var response= client.SendAsync(content);
if (response.Result.IsSuccessStatusCode)
{
var res = response.Result.Content.ReadAsStringAsync().Result;
var ajax = JsonSerializer.Deserialize(res, options);
switch (ajax.Type)
{
case 1:
Console.BackgroundColor = ConsoleColor.Green;
Console.WriteLine($"{user}: !");
break;
case 2:
Console.BackgroundColor = ConsoleColor.Yellow;
Console.WriteLine($"{user}: !");
break;
case 3:
Console.BackgroundColor = ConsoleColor.Red;
Console.WriteLine($"{user}: !");
flag = 1;
break;
default:
break;
}
}
}
}
catch (Exception)
{
throw;
}
}
Console.BackgroundColor = ConsoleColor.Blue;
Console.WriteLine($"======= {(DateTime.Now - now).TotalMilliseconds} ======");
Console.ReadLine();
}
}
class AjaxRepsone
{
public int Type { get; set; }
public bool Success { get; set; }
}
后でできるだけ早く改善して更に実际の秒杀の活动に切り込んで、捜索によって秒杀の活动の原理を理解して、自分で先に简単な试みを行って、大物が见る时またよろしくお愿いします