왜 MongoDB Java 드라이버는 조건부 난수 생성기를 사용하는가?
MongoDB의 Java Connection 드라이버에 대한 이 커밋에서 다음과 같은 코드를 봤는데 처음에는 일종의 장난으로 보입니다.다음 코드는 어떤 역할을 합니까?
if (!((_ok) ? true : (Math.random() > 0.1))) {
return res;
}
(편집: 이 질문을 게시한 후 코드가 업데이트되었습니다.)
그 노선의 역사를 살펴본 결과, 저의 주된 결론은 뭔가 무능한 프로그래밍이 작용했다는 것입니다.
그 줄은 불필요하게 난해하다.일반적인 형태
a? true : b
★★★★★★에
boolean a, b
하다, 단순하다, 단순하다, 단순하다, 단순하다, 단순하다, 하다, 단순하다, 단순하다.a || b
주변의 부정과 과도한 괄호는 사물을 더욱 복잡하게 만든다.드 모건의 법칙을 염두에 둔다면 이 코드 조각이 이 사건의 핵심이 된다는 것은 사소한 관측이다.
if (!_ok && Math.random() <= 0.1) return res;
-
if (_ok == true) { _logger.log( Level.WARNING , "Server seen down: " + _addr, e ); } else if (Math.random() < 0.1) { _logger.log( Level.WARNING , "Server seen down: " + _addr ); }
부정한 코딩의 또 다른 예이지만 반대 논리에 주의해 주십시오.여기서 이벤트는 다음 중 하나의 경우에 기록됩니다.
_ok
또는 다른 경우 10%인 반면, 2의 코드는 10%의 시간을 반환하고 90%의 시간을 기록합니다.그래서 나중에 한 약속은 명확성뿐만 아니라 정확성 자체를 망쳤다.당신이 알 수 것 요.
if-then
으로.return
이 부호를 를 삽입했어요.하지만 그 후 그는 불평등 부호를 뒤집어서 효과적인 "이중 부정"을 삽입했다. 코딩 스타일의 문제는 차치하고, 확률적 로깅은 그 자체로 상당히 의심스러운 관행입니다. 특히 로그 엔트리가 그 자체의 독특한 동작을 문서화하지 않기 때문입니다.그 목적은 분명히 서버가 현재 다운되어 있다는 같은 사실을 다시 기술하는 것을 줄이는 것입니다.적절한 해결책은 서버 상태의 변경만 기록하고 각각의 관찰은 기록하지 않는 것입니다.또, 이러한 관찰의 10%를 랜덤으로 선택하는 것은 말할 것도 없습니다.네, 조금만 더 노력하면 되니까 좀 봅시다.
코드 3줄만 검사한 결과 축적된 무능의 증거가 프로젝트 전체에 대해 공정하게 설명되지 않고, 이 작품이 하루빨리 정리되기를 바랄 뿐이다.
11시간 전 가레스 리에 의해:
아마 서버 장애의 1/10 정도만 기록하는 것이 아이디어일 것입니다(따라서 로그의 대량 스팸 발송을 피할 수 있습니다).카운터나 타이머의 유지비용은 들지 않습니다.(하지만 타이머의 유지비용은 저렴할까요?)
-1에 초기화된 클래스 멤버를 추가합니다.
private int logit = -1;
테스트 블록에서 테스트를 수행합니다.
if( !ok && (logit = (logit + 1 ) % 10) == 0 ) { //log error
이것은 항상 첫 번째 오류와 그 이후의 10번째 오류를 기록합니다.논리연산자는 "단락"되므로 실제 오류가 발생한 경우에만 로그가 증가합니다.
연결에 관계없이 모든 오류의 첫 번째와 10 번째를 사용할 경우 멤버 대신 로짓클래스를 스태틱하게 만듭니다.
전술한 바와 같이 나사산은 안전합니다.
private synchronized int getLogit() {
return (logit = (logit + 1 ) % 10);
}
테스트 블록에서 테스트를 수행합니다.
if( !ok && getLogit() == 0 ) { //log error
주의: 오류의 90%를 삭제하는 것은 좋은 생각이 아니라고 생각합니다.
나는 이런 것을 전에 본 적이 있다.
다른 '블랙박스' 코드 조각에서 나온 특정 '질문'에 대답할 수 있는 코드가 있었다.응답할 수 없는 경우, 매우 느린 또 다른 '블랙박스' 코드로 전송합니다.
그래서 때로는 이전에는 볼 수 없었던 새로운 '질문'이 나타나 100개씩 한꺼번에 나타나곤 했습니다.
프로그래머는 프로그램의 작동 방식에 만족했지만, 가능하다면 미래에 소프트웨어를 개선할 수 있는 방법을 원했다.
그래서 그 해결책은 알려지지 않은 질문들을 기록하는 것이었는데, 알고 보니 다른 질문들이 1000개 있었다.통나무가 너무 커졌고, 명확한 해답이 없었기 때문에 속도를 높여도 소용이 없었습니다.하지만 가끔, 대답할 수 있는 질문들이 많이 나타나곤 했다.
로그가 너무 커져서 로그가 이 솔루션에서 얻을 수 있는 정말 중요한 것을 로깅하는 데 방해가 되었기 때문입니다.
무작위로 5%만 기록하십시오. 그러면 로그가 정리되는 동시에 장기적으로 추가할 수 있는 질문/응답이 표시됩니다.
따라서 알 수 없는 이벤트가 발생한 경우 랜덤한 양의 이벤트가 기록됩니다.
지금 보시는 것과 비슷하다고 생각합니다.
저는 이런 방식이 마음에 들지 않아서 이 코드를 삭제하고 다른 파일에 이 메시지를 기록했습니다.이렇게 하면 모든 메시지가 표시되지만 일반적인 로그파일에는 영향을 주지 않습니다.
언급URL : https://stackoverflow.com/questions/16833100/why-does-the-mongodb-java-driver-use-a-random-number-generator-in-a-conditional
'programing' 카테고리의 다른 글
Java - 정수를 문자열로 변환 (0) | 2022.07.17 |
---|---|
계산된 속성 내의 Vue JS if/else 통계 (0) | 2022.07.17 |
정상적으로 기능하려면 0을 반환해야 합니까, 아니면1을 반환해야 합니까? (0) | 2022.07.17 |
정적 변수가 악으로 간주되는 이유는 무엇입니까? (0) | 2022.07.17 |
실행 파일을 매시간 실행하도록 cron 작업을 설정하려면 어떻게 해야 합니까? (0) | 2022.07.17 |