Data.Acid를 사용할 때 이벤트 구현 변경을 처리하는 방법
Data.Acid지속성 을 위해 사용하는 중간 크기의 응용 프로그램이 Update있으며 다음 버전의 서버에 대해 내 이벤트 중 하나의 구현을 업데이트해야하는 상황에 직면했습니다 . 즉 나는
myUpdate :: Update MyState ()
myUpdate = <some outdated implementation>
자, 분명히 내 거래 내역을 손상시킬 수 있으므로 구현을 우연히 변경할 수 없으므로 사람들이 일반적으로 이것을 어떻게 처리하는지 궁금합니다. 내 옵션은 다음과 같습니다.
서버를 중지하십시오. 실행
createCheckpoint내을 위해AcidState.Event구현을 업데이트 한 다음 서버를 다시 시작하십시오. 새로운 스냅 샷에서로드하기 때문에 변경Update사항은 이전 이벤트에 대해 트리거되지 않아야합니다.AA 새 만들기
Update(같은 새 이름myUpdate_v2) 만 이용할 수 있도록 서버 로직을 업데이트myUpdate_v2사방 대신 원래의myUpdate.
두 가지 옵션 모두 장점이 있다고 생각합니다. (1)은 코드베이스에 이전 기능을 유지할 필요가 없기 때문에 더 좋지만 업데이트하는 각 서버에 대해 매우 신중하게 수행해야합니다. 그렇지 않으면 데이터가 손상 될 위험이 있습니다. (2) 더 안전합니다 (특히 myUpdate모듈의 내보내기에서 이전 구현을 제거하여 실수로 어디서든 이전 구현을 사용하지 않을 수 있음). 그렇지 않으면 약간 못생긴 느낌이 듭니다.
이 작업을 수행하는 더 좋은 방법이 있습니까? 나는 이것이 장수 한 프로젝트에서 가끔씩 만나게 될 것이라고 생각하기 때문에 이벤트 구현에 변경 사항을 적용하기위한 좋은 표준 워크 플로를 갖고 싶습니다.
해결책은 '변경'과 같은 고차 함수를 사용하지 않는 것입니다. 산성 상태 (ACID 보장, 원격으로 코드 실행 등)의 이점은 직렬화 가능한 데이터 만 사용하는 비용으로 발생합니다. 이 제한은 해제 될 가능성이 거의 없습니다.
일반적으로 이것은 큰 문제가 아닙니다. 코드를 전문화하십시오. 이것이 잘리지 않으면 MVar에서 상태를 유지하고 싶을 수도 있습니다.
'Program Club' 카테고리의 다른 글
| "장치 로그인"타임 라인 및 / 또는 offline_access + 1 회 로그인에 대한 대안 (0) | 2020.12.13 |
|---|---|
| PEM_read_bio_PrivateKey ()는 ECB 모드에서만 NULL을 반환합니다. (0) | 2020.12.13 |
| Google 드라이브에서 항상 캐시 된 앱 데이터를로드하지 않는 방법 (0) | 2020.12.13 |
| Android 프로파일 러를 사용할 때 앱이 계속 충돌합니다. (0) | 2020.12.13 |
| PHP에서 템플릿 시스템을 사용해야하는 이유는 무엇입니까? (0) | 2020.12.12 |