ฉันต้อง webservice ใช้ websockets และต้องเตรียมกำเป็นศูนย์-downtime ประจำการ เพราะฉันไม่อยากทิ้งที่มีอยู่การเชื่อมต่ออยู่จะยกขึ้ฉันตัดสินใจที่จะดำเนินสีฟ้า/สีเขียวเอาล่ะไปได้..ประจำที่! ของฉันแท้จริงทานดูเหมือนว่า:
- ฉันสร้างสองคนเหมือนกันบริการอยู่ใน portainer ฟังอยู่ต่างออกท่าเรือ. ทุกบริการมีการโหนดสภาพแวดล้อมบางอย่าแสดงตัวตัวอย่างเช่น
alfa
แล้วbeta
- ทั้งสองบริการซ่อนไว้ข้างหลังโหลด balancer และ balancer นี่เป็นบางครั้งต่อเมื่อต้อตรวจสอบสถานะของแต่ละบริการ. ถ้าบริการตอบสนองอยู่เฉพาะเส้นทาง(/balancer-keepalive รดตรวจสอบ)กับข้อความ"โอเค",บริการนี้คือที่ทำงานอยู่และ balancer สามารถลองให้บริการนี้. ถ้าบริการตอบสนองกับข้อความ"หยุด",balancer มาร์บริการนี้ใช้ในการเข้าใช้งานไม่ได้เป็นแต่ที่ทำงานอยู่การเชื่อมต่อจะมีการรักษา
- ซึ่งบริการที่ทำงานอยู่และนั่นคือเลิกเป็นซิงค์มา redis. ใน redis มีกุญแจ
lb.service.alfa
แล้วlb.service.beta
ซึ่งสามารถมีค่า 1 สำหรับที่ทำงานอยู่และ 0 สำหรับที่ไม่ได้ทำงานอยู่. ตัวอย่างของ implementation /balancer-keepalive รดตรวจสอบ เส้นทางใน nestjs:
import {Controller, Get} from '@nestjs/common';
import {RedisClient} from "redis";
const { promisify } = require("util");
@Controller()
export class AppController {
private redisClient = new RedisClient({host: process.env.REDIS_HOST});
private serviceId:string = process.env.ID; //alfa, beta
@Get('balancer-keepalive-check')
async balancerCheckAlive(): Promise<string> {
const getAsync = promisify(this.redisClient.get).bind(this.redisClient);
return getAsync(`lb-status-${this.serviceId}`).then(status => {
const reply: string = status == 1 ? 'OK' : 'STOP';
return `<response>${reply}</response>`;
})
}
}
- ใน gitlab ล่งข่าวสร้าง docker รูปภาพที่ติดป้ายไว้โดยกแท็บก่อนและเริ่มบริการใหม่อีกครั้งเรียก portainer webhook สำหรับเฉพาะเจาะจงบริการ. มันจะได้ผลดีสำหรับ 1 บริการแต่ไม่รู้ว่าต้องใช้ 2 ต่างออก DEPLOY_WEBHOOK ล่งข่าวและตัวแปรสลับไปมาระหว่างพวกเขา
image: registry.rassk.work/pokec/pokec-nodejs-build-image:p1.0.1
services:
- name: docker:dind
variables:
DOCKER_TAG: platform-websocket:$CI_COMMIT_TAG
deploy:
tags:
- dtm-builder
environment:
name: $CI_COMMIT_TAG
script:
- npm set registry http://some-private-npm-registry-url.sk
- if [ "$ENV_CONFIG" ]; then cp $ENV_CONFIG $PWD/.env; fi
- if [ "$PRIVATE_KEY" ]; then cp $PRIVATE_KEY $PWD/privateKey.pem; fi
- if [ "$PUBLIC_KEY" ]; then cp $PUBLIC_KEY $PWD/publicKey.pem; fi
- docker build -t $DOCKER_TAG .
- docker tag $DOCKER_TAG registry.rassk.work/community/$DOCKER_TAG
- docker push registry.rassk.work/community/$DOCKER_TAG
- curl --request POST $DEPLOY_WEBHOOK
only:
- tags
ของฉันคำถามซึ่งฉันไม่รู้ว่าจะแก้ปัญหาคือ:
- ตอนที่ฉันต้อง 2 บริการฉันต้น 2 ต่างกันเตรียมที่จะออกจะแท๊ webhooks จากที่ฉันต้องโทรหาหนึ่งหลังจะยกขึ้เพราะฉันไม่ต้องการที่จะเริ่มใหม่อีกครั้งทั้งสองบริการ. ยังไงเพื่อกำหนดงานอดิเรกอันไหน? วิธีที่จะรับคำสั่งเข้าใจบางอย่างเคาน์เตอร์,ถ้านี้จะยกขึ้นคือที่"alfa"หรือ"เบต้า"บริการ? ฉันควรจะใช้ gitlab รูปแบบ api และปรับปรุง DEPLOY_WEBHOOK หลังจากแต่ละคนจะยกขึ้? หรือ shoud ฉันกำจัดของ gitlab ล่งข่าว/แผ่นซีดีและตัวแปรใช้รูปแบบ api บการบริการซึ่งจะบอกฉัน webhook ที่อยู่ url?
- วิธีที่จะปรับปรุงค่าต่างๆใน redis? ฉันควรจะเตรียมกำหนดเองรูปแบบ api สำหรับเรื่องนี้?
- อยู่ที่นั่นดีกว่าทางวิธีที่จะประสบความสำเร็จในส่วนนี้?
กจากข้อมูล:ไม่สามารถใช้ gitlab รูปแบบ api จาก serviceses เพราะของเรา gitlab เป็นตัวเองเป็นเจ้าภาพในโดเมนด้านบมารถใช้งานได้เพียงจากของเราเป็นส่วนตัวเครือข่าย