Djangoは自動的に解除(1つのデータモデル)

会社のインセプション、ビジネスのボリュームが小さくて、すべてのビジネスロジックの世話をしてプログラム、今回のサーバーの数が少ないが、オンラインの簡単な、基本的な開発-テストは-開発者が、オンラインで行われます。
トラフィックの量が徐々に増加して、機能を高め、符号量が増加し、全体のプログラムを再コンパイルするために、単一のライン機能の必要性、コンパイル時間は数秒から数分または数分のさえ数十に、一方効率の低下で、一方の横方向の拡張に徐々に弱体化効果を高めるために、処理性能をもたらします。したがって、各サブモジュールのうち統一分割は、プログラムが大規模での「マイクロサービス」であろう。
マイクロサービスの性質上のメリットは自明であるが、多くのサービスが展開され、変更は確かに頭痛です。
どのようにこの問題を解決するには?Baiduは、別の後にサービス管理、サービスの標準化、プロセス、様々な用語の多くが、それは私にとって、本当にとてもフレンドリーこの初心者の特定の実装ではありません。
だから、オンラインニーズを満たし、自動パブリッシングシステムを実現するために、具体的な事業と組み合わせます。

背景

当社の開発スタッフは、スクリプトを介してパッケージをアップロードし、テストが渡され、新しい機能を完了し、プロセスといくつかの他の操作を開始します。
何ら問題は本当に乾燥していないので、ビジネスのために、それは、多くの場合、変更はありませんが、私は事業部は、ホストの数百に配備マイクロサービスの何百も、うちのスプリットを持っており、そのような操作は一日数十または倍の数百を行うべきです欠点は、解明する始めました。

  • コンパイラパッケージ自体には長い時間がかかるし、サーバーとの長い待ち時間にアップロード
  • 安心して古いドライバものの断片化されたスクリプトの束を、顔、本当に繰り返し作業に疲れてこれらの人々が解放されたとき
  • 不測の事態がロールバックを必要とする場合、操作は虎のように、別の熾烈でした

それを行う方法。
パッケージには、長い時間をアップロードしますか?先に倉庫内のパッケージの、直接的大丈夫取るために時間を使う
離散スクリプトの束を?当然、それはスクリプトを引き継ぐことではなく、統一されたコール・インタフェースOK提供
ロールバックすることは困難を?あなたはどのバージョンを使用したいバージョンのバージョン管理

リリースおよびバージョン管理を実現するために、我々はサービスがホスト協会と実際に対応したサービスのバージョンをリリース、バージョン情報サービスを記録する必要があります。

既存のホストの管理はかつての首長によって設定された、テクノロジー・スタックがあるジャンゴ1.10.1すぐにそれを開発するために、これに基づいて機能を実現するために、非常に古いバージョン。

先に行き、ライト・コードへの老婦人はシャトルバスで、Ctrl + C、Ctrl + Vは頂点に達しています。

バージョン管理サービス

このサービスは、外部キーを作り、多くのバージョン、すべての情報を記録するテーブルが冗長フィールドがたくさんあることをバインドされている場合、それがサービスに分かれ、サービスバージョン2つのテーブルになります。Djangoは以下のモデルに対応します。

私たちのコードは、サービステーブルが記録されたアドレスgitlabを投影する対応するので、直接、gitlab-CI使用されている自作の建物のgitlab管理で構成されてい

from django.conf import settings
from django.db import models

class MicroService(models.Model):
    LANGUAGE_TYPE = (
        ('cpp', 'cpp'),
        ('go', 'go'),
        ('python', 'python')
        ('other', 'other')
    )
    name = models.CharField(u'服务名称', max_length=64)
    language = models.CharField(u'语言类型', max_length=16, choices=LANGUAGE_TYPE)
    build_orig = models.CharField(u'构建来源', max_length=16, default='git') 
    build_url = models.CharField(u'构建地址', max_length=128) # gitlab or jenkins 的构建地址,用于触发构建任务
    description = models.CharField(u'描述', max_length=256, null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='created_by', on_delete=models.DO_NOTHING)
    updated = models.DateTimeField(auto_now=True)
    updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='updated_by', on_delete=models.DO_NOTHING)

    class Meta:
        db_table = 'micro_service'
        unique_together = (('name', ), )
        ordering = ['-created']

タスクgitlabトリガー、ビルド、実行、成功、失敗、タイムアウトに用意されている状態のサービスのバージョンを構築する場合、繰り返し構造は、レコードの状態の変化を列挙するために使用することができ、変更されていないバージョンが作成され、これだけ創業者と作成時間

from enum import Enum, unique

@unique
class BuildStatus(Enum):
    pending = 0
    building = 1
    success = 2
    timeout = 3
    failed = 4
    duplicate = 5

class MicroServiceVersion(models.Model):
    BUILD_STATUS = tuple([(v.value, k) for k, v in BuildStatus.__members__.items()])
  
    microservice = models.ForeignKey(MicroService, on_delete=models.DO_NOTHING)
    version = models.CharField(u'版本', max_length=48) # 版本号格式: 时间戳-提交分支-提交id
    description = models.CharField(u'描述', max_length=128, null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)
    status = models.PositiveSmallIntegerField(choices=BUILD_STATUS,default=1)
    file_path = models.FilePathField(u'程序包存放路径', max_length=128, null=True, blank=True)
    ref = models.CharField(u'构建分支', max_length=128, default='master')

    class Meta:
        db_table = 'micro_service_version'
        unique_together=(('microservice', 'version'),)
        ordering = ['-created', 'version']

サービスの例

サービスが実際にホストやサービスに関連するバージョンをリリースする予定。

  • 展開は、インスタンステーブルに関連付けられたレコードのサービスバージョンをホストを作成します
  • アップグレード、ロールバック、対応するインスタンスのバージョンを変更します
  • 削除、削除データ
状態

我々は、削除、ロールバック、アップグレードなどを展開するとき、それはとても以降の再試行に操作を容易にするために、インスタンスの状態を記録するためにフィールドを使用し、何らかの原因による故障につながる可能性があります。

ロッキング

インスタンスSERVICE_A操作をアップグレードするために、ユーザAの場合は、ので、他のユーザーがSERVICE_Aインスタンスを操作することはできません、あなたはロック解除完了後にこれらのインスタンスのすべて、ユーザAの操作をロックすることができます

対応機種:

from asset.models import Asset

@unique
class InstanceStatus(Enum):
    running = 0 # 运行中 大部分时候处于此状态
    installing = 1
    upgrading  = 2
    reverting  = 3
    deleting   = 4
    install_failed = 11
    upgrade_failed = 12
    revert_failed = 13
    delete_failed = 14

class MicroServiceInstance(models.Model):
    STATUS = tuple([(v.value, k) for k, v in InstanceStatus.__members__.items()])

    microservice = models.ForeignKey(MicroService, on_delete=models.DO_NOTHING)
    version = models.ForeignKey(MicroServiceVersion, on_delete=models.DO_NOTHING)
    host = models.ForeignKey(Asset, on_delete=models.DO_NOTHING)
    port = models.IntegerField(u'端口号', null=True, blank=True, )
    tag = models.CharField(u'标签', max_length=64, blank=True, null=True)
    weight = models.PositiveSmallIntegerField(u'权重', default=100)
    description = models.CharField(u'描述', max_length=128, blank=True, null=True)
    created = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)
    status = models.PositiveSmallIntegerField(u'实例状态', choices=STATUS, default=0)
    locked = models.BooleanField(u'操作锁定', default=False)
    is_maintain = models.BooleanField(u'是否维护中', default=False) # 保留字段

    class Meta:
        db_table = 'micro_service_instance'
        ordering = ['-created']

関係、バージョン、インスタンスを明確に、データモデルを構築し、次のステップは、図です。

おすすめ

転載: www.cnblogs.com/wbjxxzx/p/11961568.html