왜 그렇게 많은 프로그래머들이 객체 보급 계층을 절대 싫어하는가?


9

보급은 이진 직렬화 및 미리 쓰기 기록을 기반으로 메모리 내 개체 모델에 ACID 속성을 제공하는 간단한 기술입니다. 다음과 같이 작동합니다.

  • 스냅 샷으로 시작하십시오. 객체 모델을 직렬화하여 파일에 씁니다.
  • 저널 파일을 작성하십시오. 객체 모델에 대한 모든 호출에 대해 호출 및 인수를 직렬화하십시오.
  • 저널이 너무 커지거나 종료되거나 편리한 경우 체크 포인트를 수행하십시오. 새 스냅 샷을 작성하고 저널을 자릅니다.
  • 충돌 또는 전원 히트로부터 롤백 또는 복구하려면 마지막 스냅 샷을로드하고 저널에 기록 된 모든 통화를 다시 실행하십시오.

이 작업을 수행하는 데 필요한 예방 조치는 다음과 같습니다.

  • 변경 가능한 객체 참조를 이스케이프 처리하거나 유병률 레이어로 들어 가지 마십시오. 마치 RPC를 수행하는 것처럼 일종의 프록시 또는 OID 체계가 필요합니다. (이것은 ' 세례 문제 ' 라는 별명을 가진 일반적인 초보자 실수 입니다.)
  • 호출에서 도달 할 수있는 모든 논리는 완전히 결정적이어야하며 비즈니스 논리를 의미하는 I / O 또는 OS 호출을 수행하지 않아야합니다. 진단 로그에 쓸 수는 있지만 시스템 시간을 얻거나 비동기 대리자를 시작하는 것은 일반적이지 않습니다. 이는 다른 머신이나 다른 시간에 복원 된 경우에도 저널이 동일하게 재생되도록하기위한 것입니다. (대부분의 보급 코드는 트랜잭션 타임 스탬프를 얻기 위해 대체 시간 호출을 제공합니다.)
  • 저자 동시성은 저널 해석에 모호성을 도입하므로 금지됩니다.

그 이유는 ...

  • 사람들은 적합하지 않았다 프로젝트에 하나를 사용하려고 후에 대한 나쁜 맛을 개발 * 그것을?
  • 클라우스 뷔 에스테 펠트의 설득력있는 옹호 는 사람들을 끌었다 ?
  • 명령형 프로그래밍 모델을 좋아하는 사람들은 I / O를 계산에서 분리하는 것을 싫어하고 대신 I / O 및 스레딩 호출로 계산을 인터리브하는 것을 선호합니까?
  • 유병률 계층은 개념적으로 매우 단순하고 그들이 거주하는 프레임 워크의 특성에 밀접하게 묶여있어 일반적으로 프로젝트에 맞게 사용자 지정되어 너무 외계인 / 비표준 / 위험한가?
  • 하지 말아야 할 일을 똑바로 지키기가 너무 어렵다?
  • 학교에서 쓰는 법을 배우는 것과 같은 2 계층 데이터베이스 중심 앱이 아닌 무언가에 직면했을 때 초보자의 머리가 폭발하는 것처럼 보입니까? ;)

* RAM의 전체 데이터 세트를 맞는이 , 당신은 작가의 동시성을 필요로하지 않으며, 당신은 데이터웨어 하우스에 임시 쿼리,보고 또는 내보내기를 수행 할 필요가 없습니다. SQLite에 대한 사과와 함께, 유병률은 저장 파일을 개선하는 것이지 Oracle을 대체하지는 않습니다.


아하. 이름이 있는지 궁금했습니다. 그것은 항상 나에게 의미가 있었고, 나는 단지 그것에 대한 이름이 없었습니다.
greyfade

9
무슨 소리 야?
TheLQ

내가 처음 들어 본 것입니다. 무엇입니까?
Jonn

설명이 추가되었습니다.
Jeffrey Hantin

1
아 .. 나는 그 개념을 알고 있지만 나는 전에 이것을 한 적이 없다. 나에게 꽤 멋져 보인다. 나는 그것이 많은 개발자들이 "절대적으로 미워하는"것이 아니라고 확신한다.
Jonn

답변:


6

문제의 일부는 매우 구체적인 유스 케이스 (귀하의 부적절한 이유)가 있다는 것입니다. 나는이 접근법을 사용하는 시스템을 구축하고 작업했으며 실제로이 문제 인 문제가 발생하면 훌륭한 해결책이 될 수 있습니다.

또 다른 부분은 10 년 이상 전에 발견했던 더 고통스러운 사용자 정의 데이터 스토리지의 일부와 비슷하게 보이며 동일한 함정 (예 : 배치 업데이트 된 btreive)을 가지고 있다는 것입니다. "너무 관습적인"점이지만, 정중하게 작동하는 선반 부품을 찾기가 어렵습니다.

마지막 부분은 많은 경우에 대해 쿼리하기가 어려울 수 있으며 일반적으로 사람들은 지금 당장 답변을 얻는 것에 매우 익숙합니다.


11

나는 많은 개발자들이 절대적으로 그들을 싫어한다는 것을 먼저 증명해야한다고 생각합니다. 나는 그것이 사실이라고 생각하지 않습니다. 얼마 전의 파울러가 여기에 대한 일종의 패턴을 공식화했다고 생각 하십시오 .


네, 조금 혼란 스럽습니다. 올바른 이유로 사용하면 훌륭한 도구처럼 보입니다.
Matt Olenik

나는 동료들로부터 이것에 대해 절대적으로 놀라운 슬픔을 발견했기 때문에 이것을 말하는 것입니다.
Jeffrey Hantin

1
@ Jeffrey Hantin : 게으르고 마음이 닫힙니다.
Steven Evers

1
아, 그리고 패턴의 실제 초석이다 c2.com/cgi/wiki?TransactionTape
제프리 Hantin

4

이 질문에 대한 답은 이론은 단순하지만 실제는 그렇지 않다는 것입니다.

이러한 설정을 테스트하기 위해서는 수십 개의 테스트 사례가 필요하고, 다중 프로세스 또는 멀티 스레드 코드를 추가해야하며, 지속성 및 복구를 위해 테스트해야하는 수백 가지 조건으로 점프합니다.

CICS, Tuxedo, Weblogic, Websphere, JBOSS 또는 .NET과 같은 모든 트랜잭션 모니터는 이러한 모든 기능을 깨끗하고 테스트 된 방식으로 제공합니다. 그리고 모든 데이터베이스는 대부분의 응용 프로그램에 "충분한"트랜잭션 / 지속성을 제공합니다.

그 바퀴의 대부분은 오래 전에 발명되어 완성되었습니다.


이 문제와 많은 "건축가"의 경향은 해결해야 할 문제에 대한 디자인이 아무리 부적절 할지라도 아무 것도 밀어 붙이려하지 않는 "맛"을 선호하는 경향이 있습니다.
jwenting

@jwenting 그렇다면 이것이 '스트라이프 옹호'요점에 해당됩니까?
Jeffrey Hantin

2

전제 조건은 특히 메모리에서 실행될 때 ACID 준수가 필요하지 않은 대부분의 시스템에서 코딩하기에 약간 부담이됩니다. 오버 헤드 소리도 약간 불쾌합니다. 여기에는 상태 추적이 많이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.