Eber ka dhigista wakhtiga dhimista iyo kaydadka xogta

Eber ka dhigista wakhtiga dhimista iyo kaydadka xogta

Maqaalkani waxa uu si faahfaahsan u sharxayaa sida loo xalliyo arrimaha ku haboon xog-ururinta marka la dirayo. Waxaan kuu sheegi doonaa waxa ku dhici kara codsiyadaada wax soo saarka haddii aad isku daydo inaad geyso adigoon diyaargarow hordhac ah lahayn. Waxaan markaas mari doonaa codsiga marxaladaha meertada nolosha ee looga baahan yahay in ay helaan eber waqti-dhiman (qiyaastii haadka: dheeraad ah - eber dhimis). Natiijada hawlgaladeenu waxay noqon doontaa in aan ku dabaqno isbeddelka xogta gadaal-ku-habboon ee aan ku habboonayn hab gadaal-ku-habboon.

Haddii aad rabto inaad fahanto tusaalooyinka koodka ee maqaalka, waxaad ka heli kartaa iyaga GitHub.

Horudhac

Meel-dhigis eber ah

Waa maxay suufi eber hawlgelin? Waxaad dhihi kartaa tani waa marka codsigaaga la geeyo si aad si guul leh ugu soo bandhigto nooc cusub oo arjiga si aad u soo saarto, halka isticmaaluhu uusan dareemin in la heli karo. Marka loo eego isticmaalaha iyo shirkadda, tani waa sida ugu wanaagsan ee suurtogalka ah ee suurtogalka ah ee suurtogalka ah ee suurtogalka ah sababtoo ah waxay u oggolaaneysaa sifooyin cusub in la soo bandhigo iyo cayayaanka in la hagaajiyo iyada oo aan carqaladeyn.

Sidee lagu gaari karaa tan? Waxaa jira dhowr siyaabood, halkan waa mid ka mid ah:

  • dhig nooca No. 1 ee adeegaaga
  • samee guuritaanka xogta xogta
  • Geli nooca #2 ee adeegaaga si la mid ah nooca #1
  • isla marka aad aragto in version No. 2 u shaqeeyo sidii la rabay, ka saar nooca 1
  • waa diyaar!

Sahal, miyaanay ahayn? Nasiib darro, sidaas uma fududa, waxaanan si faahfaahsan u eegi doonnaa arrintaas. Hadda aynu eegno hab-diritaan kale oo caadi ah - blue green deployment.

Weligaa ma maqashay geynta cagaarka buluuga ah? Cloud Foundry ayaa tan ka dhigaysa mid aad u fudud. Bal eeg maqaalkan, halkaas oo aan ku sifeyno tan si faahfaahsan. Si kooban loo soo koobo, aan ku xasuusino sida loo sameeyo geynta cagaarka buluuga ah:

  • Hubi in laba nuqul oo koodka wax-soo-saarkaaga ah ("buluug" iyo "cagaaran") ay shaqeeyaan;
  • ku toosi dhammaan taraafikada deegaanka buluugga ah, i.e. si URL-yada wax-soo-saarka ay halkaas u tilmaamaan;
  • geyn oo tijaabi dhammaan isbeddellada codsiga ee jawiga cagaaran;
  • URL ka beddel buluug una beddel deegaan cagaaran

Gelitaanka cagaarka buluuga ah waa hab kuu ogolaanaya inaad si fudud u soo bandhigto sifooyin cusub adoon ka welwelin jebinta wax soo saarka. Tan waxa u sabab xaqiiqada ah in xitaa haddii ay wax dhacaan, aad si fudud dib ugu noqon karto jawigii hore adiga oo si fudud u “furaysanaya beddelka.”

Ka dib markaad akhrido dhammaan kuwan kor ku xusan, waxaad waydiin kartaa su'aasha: Waa maxay wakhtiga dhimista eber ee la xidhiidha keenista cagaarka buluuga ah?

Hagaag, waxay leeyihiin wax badan oo ay wadaagaan, maadaama ilaalinta laba nuqul oo isku deegaan ah ay u baahan tahay labanlaab dadaalka lagu ilaalinayo. Tani waa sababta ay kooxaha qaar u sheeganayaan Martin Fowler, raac kala duwanaanshaha habkan:

Ikhtiyaar kale waa in la isticmaalo xog isku mid ah, abuurista furayaasha buluug-cagaaran ee shabakada iyo lakabyada domainka. Habkan, kaydinta xogta inta badan waxay noqon kartaa dhibaato, gaar ahaan marka aad u baahan tahay inaad bedesho qorshaheeda si aad u taageerto nooca cusub ee software-ka.

Oo halkan waxaan ku nimid dhibaatada ugu weyn ee maqaalkan. Database. Aan mid kale eegno weedhan.

samee guuritaanka xogta xogta.

Hadda waa inaad naftaada waydiisaa su'aasha - ka waran haddii isbeddelka kaydka xogta aanu dib u soconayn? Miyayna nuqulkayga kowaad ee abka jabin doonin? Dhab ahaantii, tani waa dhab ahaan waxa dhici doona...

Marka, in kasta oo ay jiraan faa'iidooyinka waaweyn ee geynta eber-ka-dhigidda / cagaarka buluugga ah, shirkaduhu waxay u janjeeraan inay raacaan habkan soo socda ee badbaadada leh ee geynta codsiyadooda:

  • diyaari xirmo wata nooc cusub oo codsiga ah
  • xidh codsiga socda
  • ordi qoraalada si aad u guurto database-ka
  • dir oo soo saar nooc cusub oo arjiga

Maqaalkan, waxaanu ku faahfaahin doonaa sida aad ula shaqayn karto xogtaada iyo koodka si aad uga faa'iidaysato meelaynta wakhtiga dhimista ee eber.

Dhibaatooyinka database

Haddii aad haysato codsi bilaa dal ah oo aan ku kaydin wax xog ah kaydka xogta, waxa aad heli kartaa eber wakhti dhimis isla markaaba. Nasiib darro, inta badan software-ku waxay u baahan yihiin inay ku kaydiyaan xogta meel. Tani waa sababta ay tahay inaad ka fikirto laba jeer ka hor intaadan wax isbeddel ah ku samayn wareegga. Ka hor inta aynaan u gelin faahfaahinta sida loo beddelo schema si aan waqti-dhimis lahayn u suurtagasho, aan marka hore diiradda saarno schema versioning.

Nidaamka qaabaynta

In this article waxaan isticmaali doonaa Flyway sida qalab kontorool version ah (qiyaastii Turjumaada: waxaanu ka hadlaynaa guuritaanka kaydka xogta). Dabiici ahaan, waxaanu sidoo kale qori doonaa arjiga Bootka gu'ga kaas oo ku dhex dhisan taageerada Flyway oo samayn doona socdaalka schema marka la dejinayo macnaha codsiga. Markaad isticmaalayso Flyway, waxaad ku kaydin kartaa qoraalada socdaalka galkaaga mashaariicda (sida caadiga ah classpath:db/migration). Halkan waxa aad ku arki kartaa tusaale faylasha socdaalka sida

└── db
 └── migration
     ├── V1__init.sql
     ├── V2__Add_surname.sql
     ├── V3__Final_migration.sql
     └── V4__Remove_lastname.sql

Tusaalahan waxaan ku aragnaa 4 qoraal oo socdaalka ah oo, haddii aan hore loo fulin, la fulin doono midba midka kale marka codsigu bilowdo. Aynu eegno mid ka mid ah faylasha (V1__init.sql) tusaale ahaan.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Wax walba waa is-sharraxaadda saxda ah: waxaad isticmaali kartaa SQL si aad u qeexdo sida xog-ururintaada wax looga beddelayo. Wixii macluumaad dheeraad ah oo ku saabsan Spring Boot iyo Flyway, hubi Dukumentiyada Boot Guga.

Adigoo isticmaalaya qalabka xakamaynta isha leh Spring Boot, waxaad helaysaa 2 faa'iidooyin oo waaweyn:

  • waxaad kala saartaa isbeddelada xogta iyo isbeddelada koodka
  • U guurista xogta database waxay la socotaa soo daabicida codsigaaga, i.e. Habka diristaada waa la fududeeyay

Xallinta dhibaatooyinka database-ka

Qaybta soo socota ee maqaalka, waxaynu diiradda saari doonaa eegitaanka laba hab oo loo maro isbeddelka xogta.

  • iswaafajin la'aanta gadaal
  • waafaqid gadaal

Midka ugu horreeya waxaa loo tixgelin doonaa digniin ah inaadan sameynin meel-dhigid eber ah iyadoon la helin diyaargarowga hordhaca ah ... Midka labaad wuxuu bixiyaa xal ku saabsan sida aad u fulin karto hawlgelinta iyada oo aan wakhti la helin isla markaana isla mar ahaantaana ilaalinaysa iswaafajinta gadaal.

Mashruucayaga aanu ku shaqayn doono wuxuu noqon doonaa codsi Flyway Boot ah oo fudud kaas oo leh Person с first_name и last_name ku jira kaydka xogta (qiyaastii tarjumaad: Person waa miis iyo first_name и last_name - kuwani waa beeraha ku dhex yaal). Waxaan rabnaa in aan magac ka badalno last_name в surname.

Malaha

Ka hor inta aynaan u gelin faahfaahinta, waxa jira dhawr male-awaal oo aan u baahanahay in aan ka samayno codsiyadayada. Natiijada ugu weyn ee aan rabno inaan gaarno waxay noqon doontaa hab fudud oo cadaalad ah.

Qoraalka. Talo-bixin ganacsi. Hababka fududaynta waxay kaa badbaadin kartaa lacag badan taageerada (dadka badan ee aad u shaqeyso shirkaddaada, lacag badan oo aad kaydin karto)!

Looma baahna in dib loo rogo xogta xogta

Tani waxay fududaynaysaa habka dirista (qaar ka mid ah dib-u-celinta xogta ayaa ku dhow wax aan macquul ahayn, sida dib-u-celinta tirtirka). Waxaan door bidaynaa inaan dib u rogno kaliya codsiyada. Sidan, xitaa haddii aad leedahay xog-ururin kala duwan (tusaale, SQL iyo NoSQL), dhuumahaaga geynta ayaa isku si u ekaan doona.

Waa in ay mar walba suurtagal tahay in dib loo rogo arjiga hal nooc oo kale (mar dambe ma jiro)

Dib-u-celinta waa in la sameeyaa kaliya marka loo baahdo. Haddii uu jiro cillad nooca hadda jirta oo aan si sahal ah loo hagaajin, waa in aan dib ugu noqon karnaa nooca shaqada ee ugu dambeeyay. Waxaan u qaadaneynaa in nooca ugu dambeeya ee shaqeynaya uu yahay kii hore. Joogteynta koodka iyo ku habboonaanta xogta in ka badan hal baahin waxay noqon doontaa mid aad u adag oo qaali ah.

Qoraalka. Si loo akhristo badan, maqaalkan waxaan ku bedeli doonaa nooca ugu weyn ee codsiga.

Tallaabada 1: Dawlad-goboleedka hore

Nooca barnaamijka: 1.0.0
Nooca DB: v1

comment

Tani waxay noqon doontaa xaalada bilowga ah ee codsiga.

Database isbedel

DB waxa ku jira last_name.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Koodhka ayaa isbedelaya

Appku waxa uu kaydiyaa xogta qofka last_name:

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastname) {
        this.lastName = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
                + "]";
    }
}

Dib u habeyn aan ku socon karin tiirka

Aynu eegno tusaale sida loo beddelo magaca tiirka:

Feejignaan. Tusaalaha soo socda ayaa si ula kac ah wax u jebin doona. Waxaan tan u muujineynaa si aan u muujinno dhibaatada ku habboonaanta xogta.

Nooca barnaamijka: 2.0.0.BAD

Nooca DB: v2bad

comment

Isbeddellada hadda naguma oggola inaan wadno laba xaaladood (oo hore iyo kuwa cusub) isku mar. Markaa, eber dirista wakhtiga dhimista way adkaan doontaa in la gaadho (haddii malaha la tixgeliyo, dhab ahaantii waa wax aan macquul ahayn).

Tijaabada A/B

Xaalada hadda jirta ayaa ah in aanu haysano nooca codsiga 1.0.0, la geeyo wax soo saarka, iyo database v1. Waxaan u baahanahay inaan geyno tusaale labaad ee codsiga, nooca 2.0.0.BAD, oo u cusboonaysii xogta xogta v2bad.

Talaabooyinka:

  1. tusaale cusub oo ah nooca arjiga ayaa la geeyay 2.0.0.BADkaas oo u cusboonaysiiya database-ka v2bad
  2. keydka macluumaadka v2bad tiirka last_name hadda ma jirto - waxaa loo beddelay surname
  3. Xogta xogta iyo cusboonaysiinta codsigu waa lagu guulaystay oo xaaladaha qaarkood way socdaan 1.0.0, kuwa kale - in 2.0.0.BAD. Wax walba waxay ku xidhan yihiin kaydka xogta v2bad
  4. dhammaan xaaladaha nooca 1.0.0 waxay bilaabi doonaan tuurista khaladaadka sababtoo ah waxay isku dayi doonaan inay xogta geliyaan tiirka last_nameoo aan hadda jirin
  5. dhammaan xaaladaha nooca 2.0.0.BAD waxay shaqayn doontaa dhibaato la'aan

Sida aad arki karto, haddii aan dib-u-dhac aan ku habboonayn ku samayno kaydka xogta iyo codsiga, tijaabada A/B waa wax aan macquul ahayn.

Codsiga dib-u-celinta

Aynu ka soo qaadno ka dib markaan isku dayno inaan samayno geynta A/B (qiyaastii per.: qoraagu waxay u badan tahay inuu halkan ula jeeday tijaabada A/BWaxaan go'aansannay inaan u baahannahay inaan codsiga ku celinno nooca 1.0.0. Aynu nidhaahno ma rabno in aan dib u soo ceshano kaydka xogta.

Talaabooyinka:

  1. Waxaan joojineynaa tusaale ahaan nooca codsiga 2.0.0.BAD
  2. database-ku waa weli v2bad
  3. tan iyo version 1.0.0 ma fahmin waxa ay tahay surname, waxaan arki doonaa khaladaadka
  4. Jahannamo waa jabay, dib dambe uma noqon karno

Sida aad arki karto, haddii aan dib u dhac ku samayno isbeddelo aan ku haboonayn xogta xogta iyo codsiga, dib uguma noqon karno noocii hore.

Qoraallada fulinta

Backward incompatible scenario:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0.BAD
05) Wait for the app (2.0.0.BAD) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0 <-- this should fail
07) Generate a person by calling POST localhost:9992/person to version 2.0.0.BAD <-- this should pass

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"b73f639f-e176-4463-bf26-1135aace2f57","lastName":"b73f639f-e176-4463-bf26-1135aace2f57"}

Starting app in version 2.0.0.BAD
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

curl: (22) The requested URL returned error: 500 Internal Server Error

Generate a person in version 2.0.0.BAD
Sending a post to 127.0.0.1:9995/person. This is the response:

{"firstName":"e156be2e-06b6-4730-9c43-6e14cfcda125","surname":"e156be2e-06b6-4730-9c43-6e14cfcda125"}

Database isbedel

Qoraalka socdaalka oo magaca beddela last_name в surname

Xigasho qoraalka Flyway:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Script dib u magacaabay last_name.

-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;

Koodhka ayaa isbedelaya

Waxaan bedelnay magaca goobta lastName on surname.

Magacaabida tiirka si dib-u-dhac ah

Tani waa xaalada ugu badan ee aan la kulmi karno. Waxaan u baahanahay inaan sameyno isbedel aan is-waafaqayn gadaal. Waxaan mar hore caddaynay in meel-ka-dhigista eber-ka-dhimista, waa inaynaan si fudud u codsan guuritaanka xogta iyada oo aan tillaabooyin dheeraad ah la qaadin. Qaybtan maqaalka ah, waxaanu samayn doonaa 3 dirid oo codsiga ah oo ay weheliso guuritaanka xogta xogta si loo gaadho natiijada la rabo anagoo ilaalinayna is waafajinta gadaal.

Qoraalka. Xusuusnow in aan haysano database version v1. Waxay ka kooban tahay tiirar first_name и last_name. Waa inaan bedelnaa last_name on surname. Waxaan sidoo kale leenahay app version 1.0.0, kaas oo aan wali la isticmaalin surname.

Tallaabada 2: Ku dar magaca qoyska

Nooca barnaamijka: 2.0.0
Nooca DB: v2

comment

Marka aynu ku darayno tiir cusub oo koobiyayna waxa ku jira, waxa aanu abuurnaa isbeddelo xog-is-qabsi ah oo gadaal u socda. Isla mar ahaantaana, haddii aan dib u soo ceshano JAR ama aan leenahay JAR duug ah, ma jabi doono inta lagu jiro dilka.

Waxaan soo saareynaa nooc cusub

Talaabooyinka:

  1. samee guuritaanka xogta xogta si aad u abuurto tiir cusub surname. Hadda nooca DB-gaaga v2
  2. ka koobbi xogta last_name в surname. Feejignowin haddii aad haysatid xog badan, waa inaad tixgelisaa socdaalka dufcadda!
  3. ku qor koodka meesha lagu isticmaalo LABADA и новыйiyo kii hore tiirka. Hadda nooca app kaaga 2.0.0
  4. akhri qiimaha tiirka surname, haddii aysan ahayn null, ama ka last_name, haddii surname oo aan lagu cayimin. Waad tirtiri kartaa getLastName() laga bilaabo koodka, maadaama ay soo saari doonto null markaad dib u soo celinayso codsigaaga 3.0.0 si ay u 2.0.0.

Haddii aad isticmaalayso Spring Boot Flyway, labadan tillaabo waxa la samayn doonaa inta lagu jiro bilawga nooca 2.0.0 codsiyada. Haddii aad gacanta ku socodsiiso aaladda nooca database-ka ah, waa inaad samaysaa laba shay oo kala duwan si aad tan u samayso (marka hore gacanta ku cusboonaysii nooca db ka dibna geli codsiga cusub).

Waa muhiim. Xusuusnow in tiirka cusub ee la abuuray MAAHA noqon NULL AH. Haddii aad dib u rogaal celiso, codsigii hore ma oga tiirka cusub mana rakibi doono inta lagu jiro Insert. Laakiin haddii aad ku darto xannibaaddan oo db-gaaga ayaa noqon doona v2, tani waxay u baahan doontaa dejinta qiimaha tiirka cusub. Kaas oo u horseedi doona xad-gudubyo xayiraad.

Waa muhiim. Waa inaad ka saartaa habka getLastName(), sababtoo ah in version 3.0.0 Ma jiro fikrad tiir ka mid ah koodka last_name. Tani waxay la macno tahay in null lagu dhigi doono halkaas. Waxaad ka tagi kartaa habka oo aad ku dari kartaa jeegaga null, laakiin xal aad u wanaagsan ayaa noqon doona in la hubiyo in macquulka ah getSurname() waxaad dooratay qiimaha saxda ah ee aan eber ahayn.

Tijaabada A/B

Xaalada hadda jirta ayaa ah in aanu haysano nooca codsiga 1.0.0, la geeyey wax-soo-saarka, iyo kaydka xogta gudaha v1. Waxaan u baahanahay inaan geyno tusaale labaad ee codsiga nooca 2.0.0kaas oo u cusboonaysiin doona database-ka v2.

Talaabooyinka:

  1. tusaale cusub oo ah nooca arjiga ayaa la geeyay 2.0.0kaas oo u cusboonaysiiya database-ka v2
  2. Dhanka kale codsiyada qaar ayaa lagu farsameeyay tusaale ahaan nooca 1.0.0
  3. Cusboonaysiinta ayaa ahayd mid guulaysata waxaadna haysataa dhawr jeer oo ku socda arjiga nooca 1.0.0 iyo noocyo kale 2.0.0. Qof kastaa wuxuu la xidhiidhaa kaydka xogta v2
  4. version 1.0.0 ma isticmaalo tiirarka magaca qoyska ee kaydka, laakiin nooca 2.0.0 adeegsada. Iyagu isma farageliyaan, oo waa inaan khaladaad dhicin.
  5. version 2.0.0 waxay ku kaydisaa xogta tiirarka hore iyo kan cusub labadaba, iyada oo hubinaysa iswaafajinta gadaal

Waa muhiim. Haddii aad hayso wax su'aalo ah oo tirinaya walxaha ku salaysan qiyamka tiirarka hore/cusub, waa inaad xasuusataa inaad hadda leedahay qiyamyo nuqul ah (waxay u badan tahay inay weli guurayaan). Tusaale ahaan, haddii aad rabto inaad tiriso tirada isticmaalayaasha oo magacooda dambe (wax kasta oo tiirka la yiraahdo) uu ku bilaabay xarafka A, ka dibna ilaa xogta socdaalka laga dhammeeyo (oldnew column) waxaa laga yaabaa inaad haysatid xog aan is waafaqsanayn haddii aad waydiiso tiir cusub.

Codsiga dib-u-celinta

Hadda waxaan haynaa version app 2.0.0 iyo database in v2.

Talaabooyinka:

  1. ku celi codsigaaga nooca 1.0.0.
  2. version 1.0.0 ma isticmaalo tiir ka mid ah kaydka xogta surname, markaa dib-u-celinta waa inay noqotaa mid guulaysata

DB isbedel

Xog-ururinta waxa ku jira tiir la magacaabay last_name.

Qoraalka isha Flyway:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Kudar qoraal surname.

Feejignaan. Xasuusnoow inaadan ku darin karin wax caqabado ah oo aan waxba ka jirin tiirka aad ku darayso. Haddii aad dib u soo celiso JAR, noocii hore wax fikrad ah kama yeelan doono tiirka lagu daray wuxuuna si toos ah u dejin doonaa NULL. Haddii ay jirto xaddidaad noocaas ah, codsigii hore ayaa si fudud u jebin doona.

-- NOTE: This field can't have the NOT NULL constraint cause if you rollback, the old version won't know about this field
-- and will always set it to NULL
ALTER TABLE PERSON ADD surname varchar(255);

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
UPDATE PERSON SET PERSON.surname = PERSON.last_name

Koodhka ayaa isbedelaya

Waxaan u kaydin xogta sida last_name, iyo surname. Isla markaana aan ka akhrinay last_name, maadaama tiirkani yahay kan ugu habboon. Inta lagu jiro habka dirista, codsiyada qaar ayaa laga yaabaa in lagu habeeyey tusaale codsi aan wali la cusboonaysiin.

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * Reading from the new column if it's set. If not the from the old one.
     *
     * When migrating from version 1.0.0 -> 2.0.0 this can lead to a possibility that some data in
     * the surname column is not up to date (during the migration process lastName could have been updated).
     * In this case one can run yet another migration script after all applications have been deployed in the
     * new version to ensure that the surname field is updated.
     *
     * However it makes sense since when looking at the migration from 2.0.0 -> 3.0.0. In 3.0.0 we no longer
     * have a notion of lastName at all - so we don't update that column. If we rollback from 3.0.0 -> 2.0.0 if we
     * would be reading from lastName, then we would have very old data (since not a single datum was inserted
     * to lastName in version 3.0.0).
     */
    public String getSurname() {
        return this.surname != null ? this.surname : this.lastName;
    }

    /**
     * Storing both FIRST_NAME and SURNAME entries
     */
    public void setSurname(String surname) {
        this.lastName = surname;
        this.surname = surname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName + ", surname=" + this.surname
                + "]";
    }
}

Talaabada 3: Kasaarida magaca dambe ee summada

Nooca barnaamijka: 3.0.0

Nooca DB:v3

comment

Ogow per.: Sida muuqata, maqaalkii asalka ahaa qoraagu wuxuu si qalad ah uga guuriyay qoraalka block-gan tilaabada 2. Tallaabadan, waa in wax laga beddelo code-ka codsiga ee looga golleeyahay in meesha laga saaro shaqeynta adeegsata tiirka last_name.

Markaan ku darayno tiir cusub oo koobiyayna waxa ku jira, waxaan abuurnay isbedelo xogta ku haboon oo gadaal u socda. Sidoo kale, haddii aan dib u soo celino JAR ama aan leenahay JAR duug ah, ma jabi doono inta lagu jiro fulinta.

Codsiga dib-u-celinta

Hadda waxaan haynaa nooca app 3.0.0 iyo database v3. Nooca 3.0.0 ma kaydiyo xogta last_name. Tani waxay ka dhigan tahay in surname macluumaadka ugu casrisan waa la kaydiyaa.

Talaabooyinka:

  1. ku celi codsigaaga nooca 2.0.0.
  2. version 2.0.0 isticmaalo iyo last_name и surname.
  3. version 2.0.0 qaadan doona surname, haddii aysan eber ahayn, haddii kale -last_name

Database isbedel

Ma jiraan wax isbeddelo dhismeed ah oo ku yimi kaydka Qoraalka soo socda ayaa la fuliyay si loo sameeyo guuritaanka ugu dambeeya ee xogtii hore:

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
-- ALSO WE'RE NOT CHECKING IF WE'RE NOT OVERRIDING EXISTING ENTRIES. WE WOULD HAVE TO COMPARE
-- ENTRY VERSIONS TO ENSURE THAT IF THERE IS ALREADY AN ENTRY WITH A HIGHER VERSION NUMBER
-- WE WILL NOT OVERRIDE IT.
UPDATE PERSON SET PERSON.surname = PERSON.last_name;

-- DROPPING THE NOT NULL CONSTRAINT; OTHERWISE YOU WILL TRY TO INSERT NULL VALUE OF THE LAST_NAME
-- WITH A NOT_NULL CONSTRAINT.
ALTER TABLE PERSON MODIFY COLUMN last_name varchar(255) NULL DEFAULT NULL;

Koodhka ayaa isbedelaya

Ogow per.: Sifaynta block-gan waxa kale oo uu qoraagu si khaldan uga guuriyay tallaabada 2. Iyadoo la raacayo macquulka maqaalka, isbeddelada code ee tallaabadan waa in looga golleeyahay in laga saaro waxyaabaha la shaqeeya tiirka last_name.

Waxaan u kaydin xogta sida last_name, iyo surname. Intaa waxaa dheer, waxaan ka akhrinay tiirka last_name, maadaama ay tahay tan ugu habboon. Inta lagu jiro habka dirista, codsiyada qaar ayaa laga yaabaa in lagu habeeyo tusaale aan wali la cusboonaysiin.

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSurname() {
        return this.surname;
    }

    public void setSurname(String lastname) {
        this.surname = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", surname=" + this.surname
                + "]";
    }
}

Talaabada 4: Ka saara last_name database

Nooca barnaamijka: 4.0.0

Nooca DB: v4

comment

Sababtoo ah xaqiiqda ah in code version 3.0.0 ma isticmaalin tiirka last_name, wax xun ma dhici doono inta lagu jiro dilka haddii aan dib ugu laabano 3.0.0 ka dib markii ay ka saareen tiir ka database.

Qoraallada fulinta

We will do it in the following way:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}

Starting app in version 2.0.0

Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:

{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}

Killing app 1.0.0

Starting app in version 3.0.0

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}

Killing app 2.0.0

Starting app in version 4.0.0

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:

{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}

Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:

{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}

DB isbedel

Marka loo eego v3 Kaliya waxaan ka saareynaa tiirka last_name oo ku dar xaddidaadyo maqan.

-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;

-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;

Koodhka ayaa isbedelaya

Ma jiraan wax isbedel ah oo lagu sameeyay koodka.

gunaanad

Waxaan si guul leh u isticmaalnay beddelka magaca tiirka aan ku socon karin gadaal-dambe annagoo fulinayna hawl-gelin dhowr ah oo gadaal-ku-raac ah. Hoos waxaa ku qoran soo koobidda ficillada la sameeyay:

  1. dejinta nooca codsiga 1.0.0 с v1 schema database (magaca tiirka = last_name)
  2. dejinta nooca codsiga 2.0.0, kaas oo kaydiya xogta last_name и surname. Codsiga ayaa ka akhrinaya last_name. Xogta xogta ayaa ku jirta nooca v2ka kooban tiirar sida last_name, iyo surname. surname waa koobiga last_name. (FIIRO GAAR AH: Tiirkani waa inuusan lahayn caqabad aan waxba ka jirin)
  3. dejinta nooca codsiga 3.0.0, kaas oo kaydiya xogta kaliya surname oo ka akhriya magaca qoyska. Xagga kaydka xogta, guuritaanka u dambeeya ayaa dhacaya last_name в surname. Sidoo kale xaddidid NULL AH laga saaray last_name. Xogta kaydku hadda waa nooc v3
  4. dejinta nooca codsiga 4.0.0 - wax isbedel ah laguma samayn koodhka. Dejinta database-ka v4, kaas oo meesha ka saaraya last_name. Halkan waxa aad ku dari kartaa wixii caqabado maqan database-ka.

Adigoo raacaya habkan, waxaad mar walba dib u rogi kartaa hal nooc adiga oo aan jebin xogta xogta/ codsiga ku habboon.

Code

Dhammaan koodka lagu isticmaalo maqaalkan waxa laga heli karaa at Github. Hoos waxaa ku yaal sharraxaad dheeri ah.

Mashaariicda

Ka dib marka aad xirto kaydka, waxaad arki doontaa qaabka gal ee soo socda.

├── boot-flyway-v1              - 1.0.0 version of the app with v1 of the schema
├── boot-flyway-v2              - 2.0.0 version of the app with v2 of the schema (backward-compatible - app can be rolled back)
├── boot-flyway-v2-bad          - 2.0.0.BAD version of the app with v2bad of the schema (backward-incompatible - app cannot be rolled back)
├── boot-flyway-v3              - 3.0.0 version of the app with v3 of the schema (app can be rolled back)
└── boot-flyway-v4              - 4.0.0 version of the app with v4 of the schema (app can be rolled back)

Qoraalada

Waxaad socodsiin kartaa qoraallada lagu sifeeyay qoraallada hoose, kuwaas oo muujin doona isbeddelo dib-u-dhac ku-meel-gaar ah oo aan ku habboonayn xogta xogta.

Si aad u aragto kiiska oo leh isbeddello is-waafaqsan gadaal, orod:

./scripts/scenario_backward_compatible.sh

Iyo in la arko kiis leh isbeddello aan is-waafaqayn gadaal, orod:

./scripts/scenario_backward_incompatible.sh

Tusaalaha Boot Guga ee Duullimaadka

Tusaalooyinka oo dhan waxaa laga soo qaatay Spring Boot Sample Flyway.

Waad fiirin kartaa http://localhost:8080/flyway, waxaa jira liis qoraallo ah.

Tusaalahan waxa kale oo ka mid ah H2 console (at http://localhost:8080/h2-console) si aad u arki karto heerka xogta (default jdbc URL waa jdbc:h2:mem:testdb).

wixii intaa

Sidoo kale akhri maqaallo kale oo ku jira blog-keena:

Source: www.habr.com

Add a comment