문제

나는 몇 가지를 들어 최근에 개발자는 말 그들은 단순히 투표 재료(데이터베이스 파일,etc.) 를 결정할 때에는 변경하고 다음을 실행과 같이 작업을 가져옵니다.

정말이에 대해 생각과 느낌을 활용하여 사용할 수 있는 기술 등 원격 기능, WCF, 니다,등등.것보다 훨씬 더 나은율로 나타내고 있다.

그러나 나를 식별하는 이유 다른 사람들이 선호하는 하나의 방법을 통해 다른 그리고 더 중요한 것은,어떻게 다른 사람을 설득하는 투표는 잘못된 이 시대에?

도움이 되었습니까?

해결책

투표는"잘못된"이와 같이.

많은 방법에 따라 구현 및 어떤 목적이 있다.를 정말로 걱정하는 경우 immedatly notification 의 변화,그것은 매우 효율적입니다.코드에 앉아 루프,지속적으로 폴링(요구)에 자원이 변경되었는지/업데이트됩니다.즉,당신은 통할 수 있는 뭔가 다릅니다.하지만,당신의 코드는 아무것도 다른 일을 하고 있는 오버헤드의 관점에서 많은 호출을 객체에서 질문입니다.

는 경우에 당신이 적은 관심을 즉시 알림을 높일 수 있습 사이의 간격 설문 조사,그리고 이것은 또한 잘 작동하지만 정확한 간격이 어려울 수 있습니다.너무 오랫동안 당신이 놓칠 수 있는 중요한 변경이 너무 짧은 당신이 다시의 문제를 첫 번째 방법입니다.

대체과 같은 인터럽트 또는 메시지,등등.을 제공할 수 있는 더 나은 타협에서 이러한 상황입니다.당신은 통보의 변화로 즉시 실질적으로 가능하지만,이 지연은 아닙니어,그에 따라 구성 요소 tself 는 적시에 대해에 전달하는 상태 변화가 있습니다.

무슨은"잘못된"으로 폴링?

  • 그것은 리소스가 필요할 수 있으 hogging.
  • 그것은 제한할 수 있(이 있는 경우에 특히 많은 일들이 당신에 대해 알고 싶어/폴).
  • 할 수 있입니다.

하지만...

  • 그것은 본질적으로 잘못입니다.
  • 그것은 매우 효과적일 수 있다.
  • 그것은 매우 간단합니다.

다른 팁

폴링이 원칙적으로 나쁜 것으로 간주 될 수있는 두 가지 이유가 있습니다.

  1. 자원 낭비입니다. 변화가 발생하지 않고 변경 사항을 확인할 가능성이 높습니다. 이 조치에 대한 CPU 사이클/대역폭 지출은 변화를 초래하지 않으므로 다른 것에 더 잘 지출 될 수있었습니다.

  2. 폴링은 특정 간격으로 수행됩니다. 이것은 당신이 다음 번에 간격이 통과 될 때까지 변화가 일어났다는 것을 알지 못한다는 것을 의미합니다.

변경 사항을 알리는 것이 좋습니다. 이렇게하면 발생하지 않은 변경 사항에 대해 설문 조사를하지 않으며 알림을 받 자마자 변경 사항을 알 수 있습니다.

이 시대에 폴링을 사용하는 것들의 예 :

  • 이메일 고객에게 새 메시지에 대한 여론 조사 (IMAP를 사용하더라도).
  • RSS 독자는 피드 변경에 대한 여론 조사입니다.
  • 검색 엔진이 색인 페이지 변경에 대한 설문 조사.
  • stackoverflow 사용자는 '새로 고침'을 쳐서 새로운 질문에 대한 설문 조사 ;-)
  • Bittorrent 클라이언트는 무리의 변화를 추적기 (그리고 서로 DHT와 함께 생각합니다)를 설문 조사합니다.
  • 멀티 코어 시스템의 스핀 락은 코어간에 가장 효율적인 동기화가 될 수 있습니다. 지연이 너무 짧아서이 코어에서 다른 스레드를 예약 할 시간이 너무 짧은 경우, 다른 코어가 우리가 기다리고있는 모든 일을하기 전에.

때로는 비동기 알림을 얻을 수있는 방법이 없습니다. 예를 들어 RSS를 푸시 시스템으로 바꾸려면 서버는 피드를 읽고 접촉하는 방법이있는 모든 사람에 대해 알아야합니다. 이것은 메일 링리스트입니다. RSS가 피하도록 설계된 것 중 하나입니다. 따라서 대부분의 예제가 네트워크 앱이라는 사실은 문제가 될 가능성이 가장 높습니다.

다른 경우, 폴링은 비동기 알림이있는 경우에도 작동하기에 충분히 저렴합니다.

로컬 파일의 경우 변경 알림이 원칙적으로 더 나은 옵션 일 수 있습니다. 예를 들어, 영원히 찌르면 디스크가 튀어 나오는 것을 막을 수 있지만 다시 OS가 캐시 할 수 있습니다. 그리고 한 시간에 한 번만 변경되는 파일에서 매 초마다 폴링하는 경우, 기계의 처리 능력의 0.001% (또는 무엇이든)를 불필요하게 차지할 수 있습니다. 이것은 작게 들리지만 설문 조사에 10 만 파일이 있으면 어떻게됩니까?

그러나 실제로, 오버 헤드는 당신이하는 일이든 무시할 수 있으므로 현재 작동하는 코드 변경에 대해 흥분하기가 어렵습니다. 가장 좋은 점은 변화하고 싶은 시스템에서 폴링이 원인이되는 특정 문제를 조심하는 것입니다. 모든 폴링에 대한 일반적인 논쟁을 시도하는 대신 어떤 것도 찾아내는 것입니다. 당신이 아무것도 찾지 못하면, 당신은 깨지지 않은 것을 고칠 수 없습니다 ...

폴링은 절차 코드만큼 쉽고 쉽게 수행 할 수 있습니다. 폴링이 아니라는 것은 비동기 프로그래밍의 세계에 들어가는 것을 의미합니다.

그리고 모든 시스템의 모든 것과 마찬가지로 저항이 적은 경로는 일반적으로 더 일반적으로 취해 지므로, 때로는 비동기 패턴으로 물건을 복잡하게 할 필요가 없기 때문에 항상 폴링을 사용하는 프로그래머가있을 것입니다.

나는 항상 폴링을 피하기 위해 번성하지만 때로는 어쨌든 여론 조사를합니다. 특히 소규모 지역 데이터에 대해 행동하는 것과 같이 실제 비동기 핸들링의 실제 이익이 그다지 좋지 않을 때 (물론 조금 더 빨라지 만 사용자는 사용자가 이와 같은 경우의 차이는 눈치 채지 못합니다). 따라서 두 방법 IMHO의 여지가 있습니다.

클라이언트 폴링은 서버 알림뿐만 아니라 확장되지 않습니다. 수천 명의 고객이 서버에 "새로운 데이터"를 묻는 것을 상상해보십시오. 5 초마다. 이제 서버가 클라이언트 목록을 보관하여 새 데이터를 알릴 수 있다고 상상해보십시오. 서버 알림이 더 잘 늘어납니다.

사람들은 대부분의 경우 어느 수준에서, 사건이나 인터럽트 중심 상황에서도 여론 조사가 수행되고 있음을 깨달아야한다고 생각하지만, 폴링을 수행하는 실제 코드와 분리되어 있습니다. 실제로 이것은 가장 바람직한 상황입니다 ... 구현에서 자신을 고립시키고 이벤트를 다루십시오. 폴링을 직접 구현해야하더라도 코드가 분리되도록 코드를 작성하면 결과가 구현과 독립적으로 처리됩니다.

간단한 폴링은 나쁘고 비효율적이며 자원 낭비 등입니다. '폴링'이 선택되지 않더라도 어쨌든 어떤 종류의 이벤트를 모니터링하는 일부 형태의 연결성이 있습니다.

그래서 왜 여분의 마일로 가서 추가 폴링을 제자리에 두십시오.

콜백이 최선의 선택입니다. 현재 프로세스와 콜백을 연결하는 것에 대해 걱정하면됩니다. 근본적으로, 연결이 여전히 유지되고 있음을 알기 위해 여론 조사가 계속되고 있습니다.

당신이 여자 친구를 계속 전화/울리며 그녀는 결코 대답하지 않으면 왜 계속 전화를 걸까요? 그냥 메시지를 남겨두고 그녀가 '돌아올 때까지 기다리십시오';)

나는 특정 상황에 대해 가끔 폴링을 사용합니다 (예 : 게임에서는 모든 프레임마다 키보드 상태를 폴링 할 것입니다). 예, 무언가를하십시오. 그렇지 않으면 다른 것을 처리하고 나중에 다시 확인하십시오). 그러나 일반적으로 말하면, 나는 비동기 알림에 유리한 폴링을 피합니다.

내가 자원 (CPU 시간, 무엇이든)을 쓰지 않는 이유는 무언가가 일어나기를 기다리고 있기 때문입니다 (특히 자원이 처음에 그 일이 발생할 수있는 경우). 내가 폴링을 사용하는 경우, 나는 유휴 대기에 앉아 있고, 다른 곳에서 자원을 사용하기 때문에, 그것은 비 문제입니다 (적어도 나에게는).

파일 변경을 위해 설문 조사를하는 경우, 현재 대부분의 운영 체제에서 사용할 수있는 파일 시스템 알림을 사용해야한다는 데 동의합니다.

데이터베이스에서는 업데이트/삽입을 트리거 한 다음 외부 코드를 호출하여 무언가를 수행 할 수 있습니다. 그러나 즉각적인 행동에 대한 요구 사항이 없을 수도 있습니다. 예를 들어 15 분 이내에 다른 네트워크에서 데이터베이스 A에서 데이터베이스 B로 데이터를 가져와야 할 수도 있습니다. 데이터베이스 B는 데이터베이스 A에서 액세스 할 수 없을 수 있으므로 데이터베이스 B 근처에서 실행되는 독립형 프로그램으로 폴링을 수행하게됩니다.

또한 폴링은 매우 간단한 프로그램입니다. 시간 제약이 짧을 때 수행되는 첫 번째 단계 구현이며, 충분히 잘 작동하기 때문에 여전히 남아 있습니다.

폴링에 관한 것은 그것이 작동한다는 것입니다! 신뢰할 수 있고 구현하기 간단합니다.

풀링 비용이 높을 수 있습니다. 하루에 두 번의 변경 사항 만있을 때마다 매분의 변경에 대한 데이터베이스를 스캔하는 경우 매우 작은 결과를 위해 많은 리소스를 소비합니다.

그러나 알림 테크놀로지의 문제점은 구현하기가 훨씬 더 복잡하고 신뢰할 수 없을뿐만 아니라 (큰 일이지만) 그들이 작동하지 않을 때 쉽게 알 수 없다는 것입니다.

따라서 다른 테크놀로지에 대한 폴링을 삭제하면 평균 프로그래머가 사용할 수 있고 매우 신뢰할 수 있는지 확인하십시오.

나는 여기에 많은 대답이 보이지만 가장 간단한 대답은 그 대답이라고 생각합니다.

콜백의 인프라를 만드는 것보다 폴링 루프를 코딩하는 것이 훨씬 간단하기 때문입니다.

그런 다음 나중에 병목 현상이 될 경우 다른 것으로 쉽게 이해하고 재 설계/재 설계 할 수있는 더 간단한 코드를 얻습니다.

이것은 당신의 질문에 대답하지 않습니다. 그러나 현실적으로, 특히 프로세서주기가 저렴하고 대역폭이 크기 때문에 특히이 "일과 시대"에서 폴링은 실제로 일부 작업에 좋은 솔루션입니다.

이점은 다음과 같습니다.

  • 값이 싼
  • 믿을 수 있는
  • 테스트 가능
  • 유연한

나는 투표를 피하는 것이 좋은 정책이라는 데 동의합니다. 그러나, 참조 로버트의 게시물, 나는 폴링의 단순성이 여기에 언급 된 문제가 큰 문제가 아닌 경우에 더 나은 접근 방식으로 만들 수 있다고 말하고 싶습니다. 구현에 들어갑니다.

모든 것과 마찬가지로, 그것은 달라집니다. 내가 작업하는 대형 고전력 시스템은 현재 SQL과 함께 알림을 사용합니다 (특정 테이블에서 트리거에서 확장 된 SP로 호출되는 SQL 서버 내에로드 된 DLL. 그런 다음 DLL은 작업 할 수있는 다른 앱에 알립니다).

그러나 우리는 지속적으로 할 일이있을 것이라고 실제로 보장 할 수 있기 때문에 우리는 이것에서 멀어지게합니다. 따라서 복잡성을 줄이고 실제로 속도를 약간 높이기 위해 앱은 작업을 처리하고 즉시 새로운 작업을 위해 DB를 다시 투표합니다. 아무것도 없다면 작은 간격 후에 다시 시도 할 것입니다.

이것은 더 빠르게 작동하는 것처럼 보이고 훨씬 간단합니다. 그러나 볼륨이 훨씬 낮은 응용 프로그램의 또 다른 부분은 투표 간격이 매우 작지 않는 한이 방법을 사용하여 속도 증가로부터 이점을 얻지 못하면 성능 문제가 발생합니다. 그래서 우리는이 부분과 마찬가지로 그것을 떠납니다. 따라서 적절할 때는 좋은 일이지만 모든 사람의 요구는 다릅니다.

다음은 푸시 앤 풀의 상대적인 장점에 대한 좋은 요약입니다. https://stpeter.im/index.php/2007/12/14/push-and-pull-in-application-architectures/

이 답변으로 더 요약 할 수 있기를 바랍니다. 그러나 일부는 제대로 유지되지 않은 것이 가장 좋습니다.

SQL 폴링에 대해 생각할 때, VB6의 날에 돌아 왔을 때, 당신은 비동기 "청취"의 초기 화신 인 Withevents 키워드를 사용하여 레코드 세트를 만들 수있었습니다.

나는 개인적으로 항상 투표하기 전에 이벤트 중심의 구현을 사용하는 방법을 찾을 것입니다. 다음 중 하나의 수동 구현이 도움이 될 수 있습니다.

  • SQL 서비스 브로커 / 종속성 클래스
  • 어떤 종류의 대기열 기술 (RabbitMQ 또는 이와 유사)
  • UDP 방송 - 여러 노드 리스너로 구축 할 수있는 흥미로운 기술. 그래도 일부 순 작업에서 항상 가능하지는 않습니다.

이들 중 일부는 프로젝트의 약간의 재 설계가 필요할 수 있지만, 기업 세계에서는 투표 서비스보다는 더 나은 경로가 될 수 있습니다.

비동기/메시징이 일반적으로 더 좋다는 대부분의 응답에 동의합니다. 나는 Robert Gould의 대답에 절대적으로 동의합니다. 그러나 나는 하나 더 포인트를 추가하고 싶습니다.

한 가지 추가 사항은 폴링이 하나의 돌로 두 마리의 새를 죽일 수 있다는 것입니다. 하나의 특별한 유스 케이스에서, I와 관련된 프로젝트는 데이터베이스간에 메시지 대기열을 사용했지만 응용 프로그램 서버에서 데이터베이스 중 하나로 폴링하는 것입니다. 앱 서버에서 DB 로의 네트워크가 때때로 다운 되었기 때문에 폴링은 추가로 네트워크 문제를 앱에 알리는 데 사용되었습니다.

결국, 만드는 것을 사용하십시오 가장 의미가 있습니다 스케일 가능성을 염두에두고 유스 케이스.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top