max connection lb

This commit is contained in:
Marcos Uchoa 2025-08-17 22:52:14 -03:00
parent 9e173f5468
commit 2f22506d72
5 changed files with 23 additions and 15 deletions

View file

@ -19,7 +19,7 @@ services:
deploy: deploy:
resources: resources:
limits: limits:
cpus: "1.5" cpus: "0.50"
memory: "130MB" memory: "130MB"
zig1: &zig zig1: &zig
container_name: zig-pay-1 container_name: zig-pay-1
@ -28,10 +28,10 @@ services:
- SERVER_ENV=PROD - SERVER_ENV=PROD
- DEFAULT_HOST=payment-processor-default - DEFAULT_HOST=payment-processor-default
- DEFAULT_PORT=8080 - DEFAULT_PORT=8080
- DEFAULT_POOL=700 - DEFAULT_POOL=400
- FALLBACK_HOST=payment-processor-fallback - FALLBACK_HOST=payment-processor-fallback
- FALLBACK_PORT=8080 - FALLBACK_PORT=8080
- FALLBACK_POOL=400 - FALLBACK_POOL=200
- PORT=8080 - PORT=8080
- PAYMENT_SUMMARY_EXCHANGE_HOST=zig2 - PAYMENT_SUMMARY_EXCHANGE_HOST=zig2
- PAYMENT_SUMMARY_EXCHANGE_PORT=6969 - PAYMENT_SUMMARY_EXCHANGE_PORT=6969
@ -40,7 +40,7 @@ services:
deploy: deploy:
resources: resources:
limits: limits:
cpus: "0.45" cpus: "0.50"
memory: "110MB" memory: "110MB"
zig2: zig2:
<<: *zig <<: *zig
@ -49,10 +49,10 @@ services:
- SERVER_ENV=PROD - SERVER_ENV=PROD
- DEFAULT_HOST=payment-processor-default - DEFAULT_HOST=payment-processor-default
- DEFAULT_PORT=8080 - DEFAULT_PORT=8080
- DEFAULT_POOL=700 - DEFAULT_POOL=400
- FALLBACK_HOST=payment-processor-fallback - FALLBACK_HOST=payment-processor-fallback
- FALLBACK_PORT=8080 - FALLBACK_PORT=8080
- FALLBACK_POOL=400 - FALLBACK_POOL=200
- PORT=8080 - PORT=8080
- PAYMENT_SUMMARY_EXCHANGE_HOST=zig1 - PAYMENT_SUMMARY_EXCHANGE_HOST=zig1
- PAYMENT_SUMMARY_EXCHANGE_PORT=6969 - PAYMENT_SUMMARY_EXCHANGE_PORT=6969

View file

@ -95,6 +95,7 @@ const template_json_summary: []const u8 =
; ;
fn getSummary(req: *Request, res: *Response) void { fn getSummary(req: *Request, res: *Response) void {
std.Thread.sleep(1_000_000 * 50);
var from: ?DateTime = null; var from: ?DateTime = null;
var to: ?DateTime = null; var to: ?DateTime = null;

View file

@ -12,7 +12,7 @@ const Address = net.Address;
const Stream = net.Stream; const Stream = net.Stream;
const BUFFER_SIZE = 1024; const BUFFER_SIZE = 1024;
const MAX_CONNECTION_UPSTREAM = 2050; const MAX_CONNECTION_UPSTREAM = 1520;
//var metrics_mutex = std.Thread.Mutex{}; //var metrics_mutex = std.Thread.Mutex{};
//var metrics_num_requests: u64 = 0; //var metrics_num_requests: u64 = 0;
@ -68,18 +68,22 @@ pub const UpstreamServer = struct {
std.debug.assert(final_addr != null); std.debug.assert(final_addr != null);
var connections: [MAX_CONNECTION_UPSTREAM]UpstreamConnection = undefined;
for (&connections) |*conn| {
conn.* = UpstreamConnection.init(final_addr.?);
}
return UpstreamServer{ return UpstreamServer{
.address = final_addr.?, .address = final_addr.?,
.pool = connections, .pool = undefined,
}; };
} }
pub fn warmup(self: *UpstreamServer) void {
_ = std.Thread.spawn(.{ .stack_size = 1024 * 24 }, _warmup, .{self}) catch unreachable;
}
fn _warmup(self: *UpstreamServer) void {
for (0..self.pool.len) |i| {
self.pool[i] = UpstreamConnection.init(self.address);
}
}
pub fn getAvailableConnection(self: *UpstreamServer) ?*UpstreamConnection { pub fn getAvailableConnection(self: *UpstreamServer) ?*UpstreamConnection {
for (&self.pool) |*conn| { for (&self.pool) |*conn| {
if (conn.state == .available) { if (conn.state == .available) {

View file

@ -88,7 +88,10 @@ fn startLoadBalancer() !void {
const server2 = lb.UpstreamServer.init(ctx.config.fallback_host, ctx.config.fallback_port); const server2 = lb.UpstreamServer.init(ctx.config.fallback_host, ctx.config.fallback_port);
var servers = [_]lb.UpstreamServer{ server1, server2 }; var servers = [_]lb.UpstreamServer{ server1, server2 };
servers[0].warmup();
servers[1].warmup();
std.Thread.sleep(1_000_000 * 1000 * 2);
var mylb = try lb.LoadBalancer.init(ip_map, ctx.config.port, &servers); var mylb = try lb.LoadBalancer.init(ip_map, ctx.config.port, &servers);
try mylb.start(); try mylb.start();

View file

@ -88,7 +88,7 @@ pub const PaymentIntegrator = struct {
pi.payment.integration_status = .not_integrated; pi.payment.integration_status = .not_integrated;
pi.is_integrated = true; // liar pi.is_integrated = true; // liar
} else { } else {
pi.payment.requested_at = DateTime.now(); //pi.payment.requested_at = DateTime.now();
pi.ticket = self.service_pool.dive(pi.getMessage(), MAX_RETRY - pi.retries) catch null; pi.ticket = self.service_pool.dive(pi.getMessage(), MAX_RETRY - pi.retries) catch null;
pi.retries -= 1; pi.retries -= 1;
} }