ZeroMQ 비동기 통신 - MetaTrader 4 용 라이브러리.
이것들은 zeromq tcp 소켓의 데모와 함께 zeromq 라이브러리에 대한 부분 바인딩이다. 누구든지 더 완벽한 바인딩을 만들면 공유하십시오! 모든 기능이 필요할 수도 있습니다. 리눅스 와인 버전도 포함되어 있습니다.
& quot; Ø 동시성 프레임 워크로 작동하는 소켓 라이브러리.
Ø inproc, IPC, TCP 및 멀티 캐스트를 통해 메시지를 전달합니다.
Ø 팬 아웃, pubsub, 파이프 라인, 요청 - 응답을 통해 N 대 N을 연결하십시오.
Ø 클러스터 된 제품 및 수퍼 컴퓨팅에 충분히 빠릅니다.
확장 가능한 멀티 코어 메시지 전달 응용 프로그램을위한 비동기 I / O
Ø 크고 활동적인 오픈 소스 커뮤니티.
C, C ++, Java, Python을 포함한 Ø 20+ 언어.
Linux, Windows, OS X 등 대부분의 OS
완전한 상업적 지원을 제공하는 LGPL 무료 소프트웨어. "
그리고 사용법이 매우 간단합니다. 당신은 자동으로 원시 소켓에 연결할 수 없다는 것에 주목하자. 여기서 zeromq를 zeromq에 연결한다. 비록 내가 아직 바인딩하지 않은 zeromq_poll을 사용하여 네트워크에 원시 소켓을 추가하는 것에 대한 지원이 있다고 생각하지만.
버전 2 : Windows 및 Linux x86 용 사전 컴파일 된 libx 32 비트가 추가되었습니다 (zeromq 버전 2.0.10 사용). Windows 용 cmake 빌드 스크립트 추가. 'localhost'대신 포트 127.0.0.1을 사용하도록 zeromq 스크립트가 업데이트되었습니다. 그리고 가장 중요한 것은 mql4와 zeromq 라이브러리 사이의 공유 메모리 버그를 수정했습니다. 기본적으로 우리는 래퍼 라이브러리로 전송 된 문자열을 복사하고 메시지에서 데이터를 요청할 때 새로운 문자열을 복사합니다. malloc이 샘플 코드에서 null을 반환하는지 확인하지 않습니다. 메모리가 충분하지 않은 경우 드문 경우에 포함되어야합니다. 그래서 우리는 널 포인터를 전달하려고함으로써 metatrader를 망가 뜨리지 않습니까? 나는 곧 이것을 시험 할 것이다.
버전 3 : pub / sub, multipart send (수신 안 함), 하나의 소켓에서 폴링, 원시 메시지를 사용하지 않음 (자동 생성 / 삭제). commando 및 pub / sub 예제 추가, 다른 예제 업데이트. 참고 : 나는 poll 객체를 안전하게 파기하는 방법을 모른다. free (ptr)를 시도하고 metatrader가 충돌했다. 누구든지 여기에서 도울 수 있다면.
Forex zmq
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
ZeroMQ를 사용하여 MetaTrader Terminal & amp; ZeroMQ를 사용하여 nodejs 서버에 로그인하십시오.
내 nodejs / express server. js 파일 :
nodejs 응용 프로그램과 병행하여 로컬로 실행되는 MetaTrader Terminal에서 tcp : //127.0.0.1 : 3000으로 환율을 보내려면 어떻게해야합니까?
기본적으로 나는 socket. io를 클라이언트에 사용하여 그것들을 내보내고 싶다.
당신의 전문가라면이게 뭔가 될 것이라고 생각합니다. 그것을 시도하지 않았습니다.
Forex zmq
당겨 요청 0.
오늘 GitHub에 가입하십시오.
GitHub은 코드를 호스팅하고 검토하고, 프로젝트를 관리하고, 소프트웨어를 함께 구축하기 위해 함께 일하는 2,000 만 명이 넘는 개발자들의 본거지입니다.
HTTPS로 복제하십시오.
Git을 사용하거나 웹 URL을 사용하여 SVN에서 체크 아웃하십시오.
MQL 언어 (32 비트 MT4 및 64 비트 MT5 모두)에 대한 ZMQ 바인딩
이것은 MetaTrader4 / 5에서 제공하는 MQL4 / 5 언어 용 ZeroMQ 라이브러리의 완전한 바인딩입니다.
프로그래밍 능력을 가진 거래자들은 공식 기사에서 제안한 PIPE 트릭보다 ZeroMQ와 같은 메시징 솔루션을 원했고 간단하고 강력했습니다. 그러나 MQL에 대한 바인딩은 구형이거나 완성되지 않았습니다 (대부분 장난감 프로젝트이며 기본 기능 만 구현됩니다). 이 바인딩은 라이브러리의 최신 4.2 버전을 기반으로하며 API 설명서에 지정된대로 모든 기능을 제공합니다.
이 바인딩은 MQL4 / 5간에 호환이 유지되도록 시도합니다. 두 버전 사용자는이 바인딩을 단일 헤더 집합과 함께 사용할 수 있습니다. MQL4와 MQL5는 기본적으로 최신 버전에서 병합된다는 점에서 동일합니다. 차이점은 런타임 환경에 있습니다 (MetaTrader5는 기본적으로 64 비트이지만 MetaTrader4는 32 비트 임). 거래 시스템도 다르지만이 바인딩의 우려는 없습니다.
이 바인딩에는 세 가지 파일 집합이 포함됩니다.
바인딩 자체는 / Zmq 디렉토리에 있습니다. Include에는 mql4-lib의 일부인 Mql 디렉토리가 있습니다. Previous Common. mqh 및 GlobalHandle. mqh는 실제로이 라이브러리에 있습니다. 릴리스 1.4에서는 mql4-lib 내용이 여기에 그대로 복사되어 직접 참조됩니다. 다른 많은 기능을 포함하고 있기 때문에 전체 mql4-lib를 설치하는 것이 좋습니다. 그러나 mql-zmq를 단독으로 사용하려는 사용자는 여기에 포함 된 작은 하위 집합 만 배포하면됩니다.
테스트 스크립트 및 zmq 가이드 예제는 Scripts 디렉토리에 있습니다. 스크립트 파일은 기본적으로 mq4이지만 확장자를 mq5로 변경하여 MetaTrader5에서 사용할 수 있습니다.
64 비트 (라이브러리 / MT5) 및 32 비트 (라이브러리 / MT4) ZeroMQ 및 libsodium의 사전 컴파일 된 DLL이 제공됩니다. 해당 DLL을 MetaTrader 터미널의 라이브러리 폴더에 복사하십시오. MT5 32 비트를 사용하는 경우 Library / MT4의 32 비트 버전을 사용하십시오. DLL을 사용하려면 최신 Visual C ++ 런타임 (2015)이 있어야합니다.
MT5 32 비트를 사용하는 경우 Include / Mql / Lang / Native. mqh 맨 위에있는 __X64__ 매크로 정의를 주석 처리해야합니다. 필자는 MT5가 64 비트라고 가정합니다. 네이티브 매크로로 32 비트를 검출 할 방법이 없기 때문에 포인터 관련 값을 정의하려면이 매크로가 필요합니다.
이 DLL은 수정없이 공식 소스에서 컴파일됩니다. 이 바이너리를 신뢰할 수 없다면 스스로 컴파일 할 수 있습니다. libsodium. dll은 공식 이진 릴리스에서 복사됩니다. 커브가 아닌 보안 메커니즘을 지원하거나 OpenPGM과 같은 전송을 사용하려면 자체 DLL을 컴파일해야합니다.
MQL 문자열은 Win32 UNICODE 문자열입니다 (기본적으로 2 바이트 UTF-16). 이 바인딩에서 모든 문자열은 dll 계층에 보내기 전에 utf-8 문자열로 변환됩니다. ZmqMsg는 MQL 문자열의 생성자를 지원하며 기본값은 null로 끝나지 않습니다.
공식 가이드에서 :
프로세스에서 하나의 컨텍스트를 만들고 사용해야합니다. 기술적으로 컨텍스트는 단일 프로세스의 모든 소켓에 대한 컨테이너이며 한 프로세스에서 스레드를 연결하는 가장 빠른 방법 인 inproc 소켓의 전송 역할을합니다. 런타임에 프로세스에 두 개의 컨텍스트가있는 경우이 프로세스는 별도의 ZeroMQ 인스턴스와 같습니다.
MetaTrader에서는 모든 스크립트와 전문가 Advsior가 자체 스레드를 가지고 있지만 모두 프로세스를 공유합니다. 즉 터미널입니다. 따라서 모든 MQL 프로그램에서 단일 전역 컨텍스트를 사용하는 것이 좋습니다. Context의 공유 매개 변수는 컨텍스트 생성 및 파괴의 동기화에 사용됩니다. 그것은 세계적으로, 그리고 인간이 쉽게 인식하지 못하는 방식으로 더 잘 지어집니다. 예 : __3kewducdxhkd__.
Scripts / Test에서 간단한 테스트 스크립트를 찾을 수 있으며 Scripts / ZeroMQGuideExamples에서 공식 가이드의 예제를 찾을 수 있습니다. 모든 예제를이 바인딩으로 변환하려고하지만 지금은 hello world 예제 만 제공됩니다. 나는 그 예제를 점차 추가 할 것이다. 물론이 바인딩을 포크에 넣는다면 관심이 있고 끌어 오기 요청을 보낼 수 있습니다.
다음은 HelloWorldServer. mq4의 샘플입니다.
더 많은 테스트를 작성하십시오. 공식 ZMQ 가이드에서 더 많은 예제를 추가하십시오. 자세한 문서 공통 패턴을위한 고급 API.
2017-10-28 : 1.5 릴리스 : 중요 : Socket. send에 대한 API 변경; PollItem 중복 API (# 11) 제거; 컴파일러 경고 (# 10) 및 컴파일 실패 (# 12) 수정. ZMQ 가이드에서 RTReq 예제 추가 3 장. 2017-08-18 : 1.4 출시 : ZmqMsg setData 버그 수정. 라이센스를 Apache 2.0으로 변경하십시오. mql4-lib 의존성을 직접 확인하십시오. 2017-07-18 : 1.3 출시 : 리팩토링 설문 조사 지원; 공식 ZMQ 가이드에서 2 장의 예를 추가하십시오. 2017-06-08 : 1.2 출시 : GlobalHandle 버그 수정. ZmqMsg에 재 작성 메소드를 추가하십시오. ZMQ 안내서의 모든 예제를 완료하십시오. 2017-05-26 : 1.1로 출시 : 터미널에서 ZMQ 컨텍스트를 전역으로 공유하는 기능을 추가하십시오. 2016-12-27 : 1.0 릴리스.
&부; 2017 GitHub, Inc. 용어 개인 정보 보안 상태 도움말.
현재이 작업을 수행 할 수 없습니다.
다른 탭이나 창을 사용하여 로그인했습니다. 새로 고침하여 세션을 새로 고침하십시오. 다른 탭이나 창에서 로그 아웃했습니다. 새로 고침하여 세션을 새로 고침하십시오.
제롬.
이 문서에서는 주제 일치에 필요한 모든 기능과 콘텐츠 기반 라우팅에 필요한 대부분의 기능을 제공하는 검색 알고리즘에 대해 설명합니다. 이 문서는 원래 iMatix Corporation의 Pieter Hintjens에 의해 OpenAMQ 사양의 일부로 작성되었으며 여기에 설명 된 기술은 OpenAMQ의 주제 일치 엔진의 기초를 형성합니다. 나중에이 문서는 최적화된 주제 라우팅 알고리즘과 메시지 필터링 문제를 다루기 위해 업데이트되었습니다.
메시지를 요청과 일치시키는 것은 메시지 지향 미들웨어 서버의 일반적인 병목 현상입니다. 표준 메카니즘은 참 / 거짓 결과를 제공하도록 해석되는 SQL - 같은 절인 "선택자"이다. 셀렉터는 "콘텐트 기반 라우팅"을위한 기본 도구이다. 많은 양의 메시지와 요청이 주어지면 선택기 비용은 기하 급수적으로 증가합니다. "주제" 미들웨어 서버에서 사용되는 메커니즘은 계층 적 명명 시스템을 기반으로 한 더 빠른 일치 알고리즘을 제공하지만 대용량 시나리오에서는 여전히 병목 현상이 발생합니다.
& quot; 요청 & quot; 하나 이상의 "기준 (criteria)"및 하나 이상의 "필드 (fields)"를 제공하는 메시지로 구성된다. 요청은 필드 기준으로 원하는 기준을 지정합니다 (예 : 특정 값을 갖는 필드 또는 특정 패턴과 일치).
주제 기반 라우팅은 필드 값 ( '통화 = 미화 또는 GBP')을 기반으로하는 반면 주제별 매칭은 패턴 (예 : "forex. *")을 기반으로합니다.
가장 명확한 일치 기법은 각 메시지를 각 요청과 비교하는 것입니다. 그러한 비교 비용이 C라면, 하나의 메시지를 매치하는 비용은 다음과 같습니다.
여기서 R은 요청 수입니다. C의 비용은 요청의 복잡성, 즉 요청 당 평균 기준 수에 비례합니다. 소량 시나리오에서 R은 1-10 일 수 있습니다. 대용량 시나리오에서 우리는 다음을 가질 수 있습니다 :
100,000 마이크로 초 (C = 100)의 일치 비용 10,000 건 (R = 10,000)
메시지 당 10000 * 100 마이크로 초 또는 메시지 당 1 초의 비용을 제공합니다.
우리는 많은 요청이 동일하다는 점을 지적함으로써이를 향상시킬 수 있습니다. R의 최대 값이 약 100이라고 가정하면 메시지 당 비용이 메시지 당 0.01 초로 줄어들어 초당 최대 100 개의 메시지 처리량을 얻을 수 있습니다.
우리의 목표는 메시지 당 10 마이크로 초 미만의 매칭 비용을 얻는 것이고 초당 최대 100,000 개의 메시지를 처리 할 수 있습니다.
거꾸로 된 비트 맵 기법.
1980 ~ 81 년에는 록히드, Leif Svalgaard 및 Bo Tveden에서 뉴욕 전화 회사의 전화 번호 안내 시스템을 구축했습니다. 이 시스템은 2000 대의 단말기를 사용하는 20 대의 네트워크 컴퓨터로 구성되어 하루 2 백만 회 이상의 조회를 처리했습니다. 1982 년 Svalgaard와 Tveden은 Pentagon (국방 전화 서비스)에서 사용하기 위해이 시스템을 채택했습니다. 이 시스템은 아직 작동 중입니다.
스발가르트 (Svalgaard)와 튜벤 (Tveden)은 "역 비트 맵 (inverted bitmap)"개념을 발명했다. 디렉토리의 이름과 요청을 신속하게 일치시킬 수 있습니다.
거꾸로 된 비트 맵 기술은 다음 원리를 기반으로합니다.
데이터를 거의 변경하지 않지만 자주 검색합니다. 가능한 검색 수는 유한하며 항목이 기준과 일치하고 다른 위치가 0 인 각 위치에서 1과 함께 조건에 대한 대용량의 희소 배열로 나타낼 수 있습니다.
인덱싱 기술은 다음과 같이 작동합니다.
각 검색 가능한 항목의 수를 0부터 위로 지정합니다. 우리는 각 항목을 분석하여 "기준"세트를 제공합니다. 이름과 값 튜플. 기준 튜플은 이름과 값으로 인덱싱 된 테이블에 저장합니다. 각 기준 튜플에 대해 일치하는 각 항목을 나타내는 긴 비트 맵을 저장합니다.
검색 기술은 다음과 같이 작동합니다.
검색 요청을 분석하여 일련의 기준 이름 및 값 튜플을 제공합니다. 우리는 테이블에서 각 기준 튜플을 찾아 비트 맵 세트를 제공합니다. 최종 결과 비트 맵을 제공하기 위해 AND 또는 OR 또는 각 비트 맵을 사용합니다. 결과 비트 맵의 각 1 비트는 일치하는 항목을 나타냅니다.
비트 맵은 수백만 개의 항목을 나타내는 거대하고 일반적으로 압축 가능성이 높습니다. 거꾸로 된 비트 맵을 사용하는 많은 기술은 다음과 같습니다.
항목 및 검색 요청에서 정확한 기준 튜플을 유도합니다. 커다란 스파 스 비트 맵에 대한 신중한 압축 기술. 가양 성을 제거하기 위해 검색 결과를 필터링합니다.
오늘날의 웹 검색 엔진은 이러한 기술을 사용합니다. 우리 (Hintjens 등)는 이러한 기술을 사용하여 여러 가지 검색 엔진을 구축했습니다 (1990 년 STAR에서 2001 년 sm에 이르기까지).
메시지 일치에 적용.
따라서 역 비트 맵 기법은 검색 가능한 항목 집합을 사전 인덱싱하여 최소한의 작업으로 검색 요청을 해결할 수 있습니다.
검색 가능한 항목의 집합이 검색 요청의 수에 비해 비교적 안정적 일 때만 효율적입니다. 그렇지 않으면 재 인덱싱 비용이 과도합니다.
우리가 메시지 매칭에 역 비트 맵 기법을 적용 할 때, 메시지가 "검색 가능한 항목"이라고 생각하는 것이 혼동 스러울 수 있습니다. 이는 메시지 일치 요청이 메시지와 관련하여 상대적으로 안정하다는 점을 제외하면 논리적 인 것처럼 보입니다.
따라서 우리는 다음과 같이 역할을 뒤집어 놓아야합니다.
"검색 가능한 항목" 일치하는 요청입니다. 이 요청은 & quot; 가입 & quot; 토론 목적으로. "검색 요구"는, 메시지입니다.
색인 생성 프로세스가 이제 다음과 같이 작동합니다.
각 경기 요청은 0부터 번호를 매 깁니다. 각 일치 요청을 분석하여 일련의 기준 튜플을 제공합니다. 기준 튜플을 이름과 값으로 인덱싱 된 테이블에 저장합니다. 각 기준 튜플에 대해 요청하는 각 일치 요청을 나타내는 긴 비트 맵을 저장합니다.
메시지 일치 프로세스는 다음과 같이 작동합니다.
메시지를 분석하여 일련의 기준 튜플을 제공합니다. 우리는 테이블에서 각 튜플을 찾아 비트 맵 세트를 제공합니다. 우리는 비트 맵을 누적하여 최종 결과 비트 맵을 제공합니다. 결과 비트 맵의 각 1 비트는 일치하는 구독을 나타냅니다.
작동 예제.
토픽 매칭의 예.
우리가 다음과 같은 주제가 있다고 상상해보십시오.
*가 하나의 주제 이름 섹션과 일치하는 경우 이러한 가입을 상상해보십시오.
각 구독에 대한 색인을 생성 할 때 다음 비트 맵을 얻습니다.
이제 일련의 메시지에 대해 자세히 살펴 보겠습니다.
필드 일치 예제.
이 예에서는 필드 값 및 / 또는 존재를 일치시킬 수 있습니다. 즉, 구독은 필드의 정확한 값을 지정하거나 해당 필드가 존재하는지 묻습니다.
다음 구독 정보를 상상해보십시오.
각 서브 스크립 션에 대해 필드 이름 / 값 튜플을 색인 할 때 다음과 같은 비트 맵을 얻습니다.
이제 일련의 메시지에 대해 자세히 살펴 보겠습니다.
메시지 A : & quot; currency = JPY, market = forex, slow & quot;
메시지 B : & quot; 통화 = JPY, 긴급 & quot;
메시지 C : & quot; market = forex, currency = EUR & quot;
적중 횟수는 다음과 같습니다.
일치하지 않는 구독의 경우 0입니다. 하나 이상의 일치 조건 (논리 OR 일치)이있는 구독의 경우 1 이상 모든 기준이 일치 할 때 기준 계수와 같습니다 (논리 AND 일치).
최적화 된 주제 라우팅 알고리즘.
위에 제시된 주제에 대한 라우팅은 매우 빠르지 만 대규모 주식 거래 시나리오 (수백만 개의 고유 주제, 수천 개의 구독)에서 너무 많은 메모리를 소비하는 경향이 있습니다. 이 섹션에서는 적절한 메모리 요구 사항을 가진 최적화 된 주제 라우팅 알고리즘을 소개합니다.
먼저 개별 구독을 구성 요소로 분해 해 봅시다. 주제의 첫 번째 부분, 주제의 두 번째 부분 등이 있습니다. 가장 긴 구독은 우리가 고려해야 할 부분의 최대 개수를 결정합니다. 우리가 계산 한 최대 숫자보다 많은 부분이 포함 된 메시지가 있으면 구독과 일치하지 않는다고 가정하는 것이 안전합니다. 우리는 추가 처리없이 바로 이러한 메시지를 삭제할 수 있습니다.
주제가 최대 크기를 초과하지 않는 경우 위에서 설명한 역 비트 맵 기법을 사용하여 각 개별 구성 요소를 구독의 해당 구성 요소와 일치시킵니다.
우리가 구독 & quot; trade, forex. eur, forex. * & quot;을 따르고 있다고 가정 해보십시오. 구성 성분의 최대 수는 2 :
첫 번째 구성 요소의 비트 맵 반전 :
두 번째 구성 요소의 비트 맵 반전 :
& quot; null " 각 비트 맵의 행 & quot; null " 해당 특정 구성 요소가 없다는 것을 의미합니다. 예를 들어, "거래" 제 2 구성 요소를 갖지 않으므로, null "이다.
또한 & quot; 다른 " 열. 이는 각 비트 맵의 행 수를 구독에 나타나는 구성 요소의 가능한 대체 수와 일치시키는 방법입니다. 구독에 표시되지 않는 값에 대해 새 행을 추가 할 필요가 없습니다. 예를 들어, & quot; forex. usd " 제 2 성분 " usd "이지만 구독에 언급되지 않았으므로 비트 맵에 별도의 줄이 필요하지 않습니다. 단순히 & quot; 다른 " 값.
매칭 알고리즘 자체는 쉽습니다. 메시지의 주제를 구성 요소로 분리하고, 각각의 반전 된 비트 맵에서 해당 행을 찾아 선택한 행에서 논리 AND를 수행하십시오. 이는 최대 N 개의 행이 결합 된 것을 의미하며, N은 가입의 구성 요소의 최대 수입니다. 이것은 꽤 낮은 숫자이며 아마도 10 미만입니다.
또한 모든 행에 논리적 결합을 반드시 수행 할 필요는 없습니다. 몇 개의 행을 처리 한 후에 빈 비트 맵을 얻으면 아무런 요지가없고 후속 행에 대해 AND를 수행합니다. 주제가 어쨌든 어떤 구독과도 일치하지 않습니다.
다음은 일치하는 작동 방식에 대한 몇 가지 예입니다.
메시지에 & quot; forex. eur & quot; 이야기. & quot; 외환 " 제 1 구성 비트 맵으로부터 " eur " 행을 두 번째 구성 비트 맵에서 제거하고 행에 대해 논리 AND를 수행합니다.
이제 & quot; forex. jpy " 이야기:
한 가지 예. 단일 구성 항목 ( "거래")이있는이 시간 메시지는 다음과 같습니다.
지금까지 언급되지 않은 중요한 최적화가 있습니다. 메시지의 토픽에 널 시퀀스 (예 : "forex. null. null. null. null. null")가 있으면 두 번째 및 이후 null에 해당하는 구성 요소에 대해 걱정할 필요가 없습니다. & quot; forex. null. null. null. null. null & quot; 알고리즘은 첫 번째 구성 비트 맵의 행과 두 번째 구성 비트 맵의 행을 AND해야하지만 세 번째에서 여섯 번째 구성 요소에 대한 행은 무시해도됩니다. (최적화의 정확성에 대한 증거는 독자의 연습 과제로 남아 있습니다.)
위의 최적화는 주제 트리가 불균형 한 경우 특히 중요합니다. 예를 들어, 대부분의 주제가 세 구성 요소로 구성되어 있지만 구성 요소가 100 개인 단일 주제가있는 경우 해당 주제를 등록하면 반전 된 비트 맵의 행 수가 100 개가됩니다. 따라서 위의 최적화가 없으면 각 메시지 일치에는 100 개의 비트 맵 연결이 필요하지만 99 %의 경우에는 3 연결만으로도 일치를 수행 할 수 있습니다.
필터링은 일치하는 것과 유사합니다. 단 하나의 구분은 특정 구독이 일치하는 것이 아니라 적어도 하나의 구독이 일치 하는지를 확인하려는 것입니다.
필터링은 모든 메시지가 유선을 통해 전송되고 모든 로컬 구독과 일치하지 않는 메시지를 필터링하는 수신자의 책임이있는 멀티 캐스트 시나리오에서 특히 유용합니다.
정확히 동일한 역변환 된 비트 맵 알고리즘이 사용되지만, 필터링 유스 케이스의 경우 더욱 더 최적화 할 수 있습니다.
필터링을 사용하면 기본적으로 결과 비트 맵에 적어도 하나의 비트 세트가 있는지 여부에 관심이 있습니다. 따라서 첫 번째 비트가 1이라는 것을 알게되면 나머지 비트를 평가할 필요가 없습니다. 따라서 알고리즘은 개별 구독을 왼쪽에서 오른쪽으로 평가하고 일치하는 첫 번째 구독을 발견하면 중지 할 수 있습니다.
& quot; forex. eur & quot; 위의 예 :
세 번째 구독에는 AND가 수행되지 않습니다. 이것은 약간의 도움이 될 것 같지만 많은 비트 맵이 수천 개의 구독으로 구성되어있어 많은 프로세싱을 절약 할 수 있습니다.
분명히 비트 단위로 논리 AND를하는 것은 대단히 비효율적입니다. 실제 구현에서 AND는 프로세서 데이터 버스 폭 또는 전용 SIMD 명령어로 128 개 이상의 배치에 따라 32 개 또는 64 개 서브 스크립 션이 포함 된 배치에서 왼쪽에서 오른쪽으로 수행해야합니다.
연구 아이디어.
매칭 알고리즘을 더욱 빠르게 할 수있는 몇 가지 방법이 있습니다. 보다 빠른 메시지 매칭 및 필터링을 위해 가입 / 탈퇴에 더 많은 작업을해야합니다.
한 가지 가능성은 구독을 제한하여 구독 수를 줄이는 것입니다. 필터링 사용 사례에서 " 외환 * 구독하면 & quot; forex. eur & quot; 왜냐하면 전자는 후자의 상위 집합이기 때문입니다.
또 다른 가능성은 대부분의 메시지와 일치하는 것으로 예상되는 구독을 비트 맵 왼쪽으로 이동하면서 오른쪽에서 성공할 확률이 작은 구독을 남겨 둘 수 있습니다. 필터링 유스 케이스에서 논리적 결합의 왼쪽에서 오른쪽으로의 평가와 결합하여, 대부분의 경우 초기에 성공할 알고리즘을 얻을 수 있으며, 반전 된 비트 맵의 처음 몇 컬럼을 평가 한 후 잘하면된다.
특정 구독이 일치 할 가능성이 있는지 여부를 판단하는 확실한 방법이 있습니다. 구독에 더 많은 와일드 카드 (*)가 있으면 더 큰 메시지 집합이 일치 할 수 있으므로 성공할 가능성이 큽니다. 그렇게하면 많은 수의 와일드 카드를 사용하여 구독을 왼쪽으로 이동하면서 오른쪽에 와일드 카드가 없거나 적은 수를 유지하면 매우 효율적인 알고리즘을 제공 할 수 있습니다.
결론.
위의 알고리즘을 적용하면 대량의 다양한 주제와 구독의 경우에도 나노초 또는 수십 마이크로 초 범위의 단일 메시지를 일치 시키거나 필터링 할 수있는 시스템을 제공 할 수 있다고 믿습니다.
의견 : 13.
어딘가에 페이지 / zeromq의 기사를 준비 / SUB 소켓을 사용하여 구독 할 때 메시지를 필터링 / 일치에 대한 트라이를 사용하여 준비.
이 기사에서는 주제 일치 및 메시지 필터링에 대해 설명하며 실제로 사용되는 방법을 설명합니다. 이 기사는 AMQP에만 관련이 있습니까? 아니면 제로 MQ에서도 실제로 사용됩니까? MQ가 실제로 0 MQ에서 사용되는 경우 트라이와 일치 / 필터링되는 것은 무엇입니까? 성능 차이에 대해 자세히 설명해 주시겠습니까? 왜이 필터링이 다른 것과 어떻게 다른가요? 왜 어디에서나 가장 최적화 된 필터링 / 일치가 아니십니까?
여기서 설명한 주제 일치는 매우 빠르고 유연하며 모든 종류의 일치를 처리 할 수 있지만 대기 시간이 짧은 시스템에 나쁜 새로운 주제 키가있을 때마다 많은 작업을 수행합니다. 시험은 더 간단하고보다 예측 가능한 성능을 제공합니다.
그럼에도 불구하고 나는 trie를 업데이트해야한다고 생각할 것이다. 왜냐하면 새로운 토픽이 추가되고 trie의 각 노드는 어떤 큐를 전달해야 하는지를 나타내는 비트 맵을 포함하기 때문이다.
trie (술집 및 하위 필터링 용)를 어떻게 사용 하시겠습니까?
trie가 어떻게 사용되는지 코드를 읽을 수 있습니다.
글쎄, 나는 가입자 코드에 대해 이해하고 있지만, 펍 사이드 코드에 대한 자세한 내용을 던질 수는있다.
메시지 일치의 경우 일치하는 기준의 수는 구독 당 몇 개가 있지만 메시지에는 필드 / 값의 10 초가 포함됩니다.
이 경우 필드 / 값의 대부분이 올바른 색인 표에 나타나지 않고 사용하지 못하고 시간이 낭비됩니까?
일반적으로 일치시키려는 필드는 나머지 필드와 구분하여 머리글에 넣습니다. _any_ 필드에서 실제로 일치를 허용하려면 덜 효율적인 프로세스가 있어야합니다.
오렌지. #. 노란색과 같은 구독이있는 경우. 이것을 사용하여 비트 맵을 만드는 방법은 무엇입니까?
이 기사의 설명을 읽으면 분명해야합니다.
중간에 와일드 카드가있는 구독을 추적 할 수있는 새 테이블을 추가 할 때 구현을 더 복잡하게 만들 때 처음에는 합의자를 예측할 수 없기 때문에 구현하는 동안 의미가 있습니다. 이 방법을 구현하는 쉬운 방법이 있는지 묻습니다.
기사가 설명해 ..
모든 조건에 대한 테이블을 만들려면 sub1은 주황색이고 노란색은 sub2는 apple. custard입니다. *
그래서 sub1 비트 맵은 1100이고 sub2는 0011이 될 것입니다.
그런 다음 각 메시지에 대해 비트 맵을 만듭니다.
0 0 0 0 - & gt; 1100이 아니므로 메시지가 일치하지 않으며 일치하는 필드도 없습니다.
0 0 1 0 - & gt; 0011이 아니므로 메시지가 일치하지 않지만 일치하는 필드가 하나 있습니다.
1 1 0 0 - & gt; 1100이므로 메시지는 일치하고 주문은 chk입니다.
이 알고리즘을 추가 한 후에 성능 테스트를 어떻게 했습니까? 나는 당신이 사용하는 도구가 무엇인지 의미합니다.
방금 구독을 생성 한 다음 임의의 메시지와 일치시키는 단일 스레드 테스트 사례를 실행했습니다.
글 : 2007 년 8 월 7 일 10:19.
개정 : 2012 년 4 월 17 일 11:55.
이 페이지가 유용하다고 생각되면 다른 사람들이 찾을 수 있도록 평가하십시오.
누가이 페이지를보고 있습니까?
웹 사이트 디자인 및 컨텐츠는 iMatix Corporation의 저작권 (c) 2014입니다. 전문적인 지원을 위해 저희에게 연락하십시오. cc-by-sa 3.0에 따라 라이선스가 허여 된 사이트 콘텐츠 ØMQ는 저작권 (c) 저작권 (c) 2007-2014 iMatix Corporation 및 Contributors입니다. ØMQ는 LGPL 하에서 허가 된 자유 소프트웨어입니다. ØMQ 및 ZEROMQ는 iMatix Corporation의 상표입니다. 이용 약관 & # 8212; 개인 정보 정책.
당겨 요청 0.
오늘 GitHub에 가입하십시오.
GitHub은 코드를 호스팅하고 검토하고, 프로젝트를 관리하고, 소프트웨어를 함께 구축하기 위해 함께 일하는 2,000 만 명이 넘는 개발자들의 본거지입니다.
HTTPS로 복제하십시오.
Git을 사용하거나 웹 URL을 사용하여 SVN에서 체크 아웃하십시오.
MQL 언어 (32 비트 MT4 및 64 비트 MT5 모두)에 대한 ZMQ 바인딩
이것은 MetaTrader4 / 5에서 제공하는 MQL4 / 5 언어 용 ZeroMQ 라이브러리의 완전한 바인딩입니다.
프로그래밍 능력을 가진 거래자들은 공식 기사에서 제안한 PIPE 트릭보다 ZeroMQ와 같은 메시징 솔루션을 원했고 간단하고 강력했습니다. 그러나 MQL에 대한 바인딩은 구형이거나 완성되지 않았습니다 (대부분 장난감 프로젝트이며 기본 기능 만 구현됩니다). 이 바인딩은 라이브러리의 최신 4.2 버전을 기반으로하며 API 설명서에 지정된대로 모든 기능을 제공합니다.
이 바인딩은 MQL4 / 5간에 호환이 유지되도록 시도합니다. 두 버전 사용자는이 바인딩을 단일 헤더 집합과 함께 사용할 수 있습니다. MQL4와 MQL5는 기본적으로 최신 버전에서 병합된다는 점에서 동일합니다. 차이점은 런타임 환경에 있습니다 (MetaTrader5는 기본적으로 64 비트이지만 MetaTrader4는 32 비트 임). 거래 시스템도 다르지만이 바인딩의 우려는 없습니다.
이 바인딩에는 세 가지 파일 집합이 포함됩니다.
바인딩 자체는 / Zmq 디렉토리에 있습니다. Include에는 mql4-lib의 일부인 Mql 디렉토리가 있습니다. Previous Common. mqh 및 GlobalHandle. mqh는 실제로이 라이브러리에 있습니다. 릴리스 1.4에서는 mql4-lib 내용이 여기에 그대로 복사되어 직접 참조됩니다. 다른 많은 기능을 포함하고 있기 때문에 전체 mql4-lib를 설치하는 것이 좋습니다. 그러나 mql-zmq를 단독으로 사용하려는 사용자는 여기에 포함 된 작은 하위 집합 만 배포하면됩니다.
테스트 스크립트 및 zmq 가이드 예제는 Scripts 디렉토리에 있습니다. 스크립트 파일은 기본적으로 mq4이지만 확장자를 mq5로 변경하여 MetaTrader5에서 사용할 수 있습니다.
64 비트 (라이브러리 / MT5) 및 32 비트 (라이브러리 / MT4) ZeroMQ 및 libsodium의 사전 컴파일 된 DLL이 제공됩니다. 해당 DLL을 MetaTrader 터미널의 라이브러리 폴더에 복사하십시오. MT5 32 비트를 사용하는 경우 Library / MT4의 32 비트 버전을 사용하십시오. DLL을 사용하려면 최신 Visual C ++ 런타임 (2015)이 있어야합니다.
MT5 32 비트를 사용하는 경우 Include / Mql / Lang / Native. mqh 맨 위에있는 __X64__ 매크로 정의를 주석 처리해야합니다. 필자는 MT5가 64 비트라고 가정합니다. 네이티브 매크로로 32 비트를 검출 할 방법이 없기 때문에 포인터 관련 값을 정의하려면이 매크로가 필요합니다.
이 DLL은 수정없이 공식 소스에서 컴파일됩니다. 이 바이너리를 신뢰할 수 없다면 스스로 컴파일 할 수 있습니다. libsodium. dll은 공식 이진 릴리스에서 복사됩니다. 커브가 아닌 보안 메커니즘을 지원하거나 OpenPGM과 같은 전송을 사용하려면 자체 DLL을 컴파일해야합니다.
MQL 문자열은 Win32 UNICODE 문자열입니다 (기본적으로 2 바이트 UTF-16). 이 바인딩에서 모든 문자열은 dll 계층에 보내기 전에 utf-8 문자열로 변환됩니다. ZmqMsg는 MQL 문자열의 생성자를 지원하며 기본값은 null로 끝나지 않습니다.
공식 가이드에서 :
프로세스에서 하나의 컨텍스트를 만들고 사용해야합니다. 기술적으로 컨텍스트는 단일 프로세스의 모든 소켓에 대한 컨테이너이며 한 프로세스에서 스레드를 연결하는 가장 빠른 방법 인 inproc 소켓의 전송 역할을합니다. 런타임에 프로세스에 두 개의 컨텍스트가있는 경우이 프로세스는 별도의 ZeroMQ 인스턴스와 같습니다.
MetaTrader에서는 모든 스크립트와 전문가 Advsior가 자체 스레드를 가지고 있지만 모두 프로세스를 공유합니다. 즉 터미널입니다. 따라서 모든 MQL 프로그램에서 단일 전역 컨텍스트를 사용하는 것이 좋습니다. Context의 공유 매개 변수는 컨텍스트 생성 및 파괴의 동기화에 사용됩니다. 그것은 세계적으로, 그리고 인간이 쉽게 인식하지 못하는 방식으로 더 잘 지어집니다. 예 : __3kewducdxhkd__.
Scripts / Test에서 간단한 테스트 스크립트를 찾을 수 있으며 Scripts / ZeroMQGuideExamples에서 공식 가이드의 예제를 찾을 수 있습니다. 모든 예제를이 바인딩으로 변환하려고하지만 지금은 hello world 예제 만 제공됩니다. 나는 그 예제를 점차 추가 할 것이다. 물론이 바인딩을 포크에 넣는다면 관심이 있고 끌어 오기 요청을 보낼 수 있습니다.
다음은 HelloWorldServer. mq4의 샘플입니다.
더 많은 테스트를 작성하십시오. 공식 ZMQ 가이드에서 더 많은 예제를 추가하십시오. 자세한 문서 공통 패턴을위한 고급 API.
2017-10-28 : 1.5 릴리스 : 중요 : Socket. send에 대한 API 변경; PollItem 중복 API (# 11) 제거; 컴파일러 경고 (# 10) 및 컴파일 실패 (# 12) 수정. ZMQ 가이드에서 RTReq 예제 추가 3 장. 2017-08-18 : 1.4 출시 : ZmqMsg setData 버그 수정. 라이센스를 Apache 2.0으로 변경하십시오. mql4-lib 의존성을 직접 확인하십시오. 2017-07-18 : 1.3 출시 : 리팩토링 설문 조사 지원; 공식 ZMQ 가이드에서 2 장의 예를 추가하십시오. 2017-06-08 : 1.2 출시 : GlobalHandle 버그 수정. ZmqMsg에 재 작성 메소드를 추가하십시오. ZMQ 안내서의 모든 예제를 완료하십시오. 2017-05-26 : 1.1로 출시 : 터미널에서 ZMQ 컨텍스트를 전역으로 공유하는 기능을 추가하십시오. 2016-12-27 : 1.0 릴리스.
&부; 2017 GitHub, Inc. 용어 개인 정보 보안 상태 도움말.
현재이 작업을 수행 할 수 없습니다.
다른 탭이나 창을 사용하여 로그인했습니다. 새로 고침하여 세션을 새로 고침하십시오. 다른 탭이나 창에서 로그 아웃했습니다. 새로 고침하여 세션을 새로 고침하십시오.
제롬.
이 문서에서는 주제 일치에 필요한 모든 기능과 콘텐츠 기반 라우팅에 필요한 대부분의 기능을 제공하는 검색 알고리즘에 대해 설명합니다. 이 문서는 원래 iMatix Corporation의 Pieter Hintjens에 의해 OpenAMQ 사양의 일부로 작성되었으며 여기에 설명 된 기술은 OpenAMQ의 주제 일치 엔진의 기초를 형성합니다. 나중에이 문서는 최적화된 주제 라우팅 알고리즘과 메시지 필터링 문제를 다루기 위해 업데이트되었습니다.
메시지를 요청과 일치시키는 것은 메시지 지향 미들웨어 서버의 일반적인 병목 현상입니다. 표준 메카니즘은 참 / 거짓 결과를 제공하도록 해석되는 SQL - 같은 절인 "선택자"이다. 셀렉터는 "콘텐트 기반 라우팅"을위한 기본 도구이다. 많은 양의 메시지와 요청이 주어지면 선택기 비용은 기하 급수적으로 증가합니다. "주제" 미들웨어 서버에서 사용되는 메커니즘은 계층 적 명명 시스템을 기반으로 한 더 빠른 일치 알고리즘을 제공하지만 대용량 시나리오에서는 여전히 병목 현상이 발생합니다.
& quot; 요청 & quot; 하나 이상의 "기준 (criteria)"및 하나 이상의 "필드 (fields)"를 제공하는 메시지로 구성된다. 요청은 필드 기준으로 원하는 기준을 지정합니다 (예 : 특정 값을 갖는 필드 또는 특정 패턴과 일치).
주제 기반 라우팅은 필드 값 ( '통화 = 미화 또는 GBP')을 기반으로하는 반면 주제별 매칭은 패턴 (예 : "forex. *")을 기반으로합니다.
가장 명확한 일치 기법은 각 메시지를 각 요청과 비교하는 것입니다. 그러한 비교 비용이 C라면, 하나의 메시지를 매치하는 비용은 다음과 같습니다.
여기서 R은 요청 수입니다. C의 비용은 요청의 복잡성, 즉 요청 당 평균 기준 수에 비례합니다. 소량 시나리오에서 R은 1-10 일 수 있습니다. 대용량 시나리오에서 우리는 다음을 가질 수 있습니다 :
100,000 마이크로 초 (C = 100)의 일치 비용 10,000 건 (R = 10,000)
메시지 당 10000 * 100 마이크로 초 또는 메시지 당 1 초의 비용을 제공합니다.
우리는 많은 요청이 동일하다는 점을 지적함으로써이를 향상시킬 수 있습니다. R의 최대 값이 약 100이라고 가정하면 메시지 당 비용이 메시지 당 0.01 초로 줄어들어 초당 최대 100 개의 메시지 처리량을 얻을 수 있습니다.
우리의 목표는 메시지 당 10 마이크로 초 미만의 매칭 비용을 얻는 것이고 초당 최대 100,000 개의 메시지를 처리 할 수 있습니다.
거꾸로 된 비트 맵 기법.
1980 ~ 81 년에는 록히드, Leif Svalgaard 및 Bo Tveden에서 뉴욕 전화 회사의 전화 번호 안내 시스템을 구축했습니다. 이 시스템은 2000 대의 단말기를 사용하는 20 대의 네트워크 컴퓨터로 구성되어 하루 2 백만 회 이상의 조회를 처리했습니다. 1982 년 Svalgaard와 Tveden은 Pentagon (국방 전화 서비스)에서 사용하기 위해이 시스템을 채택했습니다. 이 시스템은 아직 작동 중입니다.
스발가르트 (Svalgaard)와 튜벤 (Tveden)은 "역 비트 맵 (inverted bitmap)"개념을 발명했다. 디렉토리의 이름과 요청을 신속하게 일치시킬 수 있습니다.
거꾸로 된 비트 맵 기술은 다음 원리를 기반으로합니다.
데이터를 거의 변경하지 않지만 자주 검색합니다. 가능한 검색 수는 유한하며 항목이 기준과 일치하고 다른 위치가 0 인 각 위치에서 1과 함께 조건에 대한 대용량의 희소 배열로 나타낼 수 있습니다.
인덱싱 기술은 다음과 같이 작동합니다.
각 검색 가능한 항목의 수를 0부터 위로 지정합니다. 우리는 각 항목을 분석하여 "기준"세트를 제공합니다. 이름과 값 튜플. 기준 튜플은 이름과 값으로 인덱싱 된 테이블에 저장합니다. 각 기준 튜플에 대해 일치하는 각 항목을 나타내는 긴 비트 맵을 저장합니다.
검색 기술은 다음과 같이 작동합니다.
검색 요청을 분석하여 일련의 기준 이름 및 값 튜플을 제공합니다. 우리는 테이블에서 각 기준 튜플을 찾아 비트 맵 세트를 제공합니다. 최종 결과 비트 맵을 제공하기 위해 AND 또는 OR 또는 각 비트 맵을 사용합니다. 결과 비트 맵의 각 1 비트는 일치하는 항목을 나타냅니다.
비트 맵은 수백만 개의 항목을 나타내는 거대하고 일반적으로 압축 가능성이 높습니다. 거꾸로 된 비트 맵을 사용하는 많은 기술은 다음과 같습니다.
항목 및 검색 요청에서 정확한 기준 튜플을 유도합니다. 커다란 스파 스 비트 맵에 대한 신중한 압축 기술. 가양 성을 제거하기 위해 검색 결과를 필터링합니다.
오늘날의 웹 검색 엔진은 이러한 기술을 사용합니다. 우리 (Hintjens 등)는 이러한 기술을 사용하여 여러 가지 검색 엔진을 구축했습니다 (1990 년 STAR에서 2001 년 sm에 이르기까지).
메시지 일치에 적용.
따라서 역 비트 맵 기법은 검색 가능한 항목 집합을 사전 인덱싱하여 최소한의 작업으로 검색 요청을 해결할 수 있습니다.
검색 가능한 항목의 집합이 검색 요청의 수에 비해 비교적 안정적 일 때만 효율적입니다. 그렇지 않으면 재 인덱싱 비용이 과도합니다.
우리가 메시지 매칭에 역 비트 맵 기법을 적용 할 때, 메시지가 "검색 가능한 항목"이라고 생각하는 것이 혼동 스러울 수 있습니다. 이는 메시지 일치 요청이 메시지와 관련하여 상대적으로 안정하다는 점을 제외하면 논리적 인 것처럼 보입니다.
따라서 우리는 다음과 같이 역할을 뒤집어 놓아야합니다.
"검색 가능한 항목" 일치하는 요청입니다. 이 요청은 & quot; 가입 & quot; 토론 목적으로. "검색 요구"는, 메시지입니다.
색인 생성 프로세스가 이제 다음과 같이 작동합니다.
각 경기 요청은 0부터 번호를 매 깁니다. 각 일치 요청을 분석하여 일련의 기준 튜플을 제공합니다. 기준 튜플을 이름과 값으로 인덱싱 된 테이블에 저장합니다. 각 기준 튜플에 대해 요청하는 각 일치 요청을 나타내는 긴 비트 맵을 저장합니다.
메시지 일치 프로세스는 다음과 같이 작동합니다.
메시지를 분석하여 일련의 기준 튜플을 제공합니다. 우리는 테이블에서 각 튜플을 찾아 비트 맵 세트를 제공합니다. 우리는 비트 맵을 누적하여 최종 결과 비트 맵을 제공합니다. 결과 비트 맵의 각 1 비트는 일치하는 구독을 나타냅니다.
작동 예제.
토픽 매칭의 예.
우리가 다음과 같은 주제가 있다고 상상해보십시오.
*가 하나의 주제 이름 섹션과 일치하는 경우 이러한 가입을 상상해보십시오.
각 구독에 대한 색인을 생성 할 때 다음 비트 맵을 얻습니다.
이제 일련의 메시지에 대해 자세히 살펴 보겠습니다.
필드 일치 예제.
이 예에서는 필드 값 및 / 또는 존재를 일치시킬 수 있습니다. 즉, 구독은 필드의 정확한 값을 지정하거나 해당 필드가 존재하는지 묻습니다.
다음 구독 정보를 상상해보십시오.
각 서브 스크립 션에 대해 필드 이름 / 값 튜플을 색인 할 때 다음과 같은 비트 맵을 얻습니다.
이제 일련의 메시지에 대해 자세히 살펴 보겠습니다.
메시지 A : & quot; currency = JPY, market = forex, slow & quot;
메시지 B : & quot; 통화 = JPY, 긴급 & quot;
메시지 C : & quot; market = forex, currency = EUR & quot;
적중 횟수는 다음과 같습니다.
일치하지 않는 구독의 경우 0입니다. 하나 이상의 일치 조건 (논리 OR 일치)이있는 구독의 경우 1 이상 모든 기준이 일치 할 때 기준 계수와 같습니다 (논리 AND 일치).
최적화 된 주제 라우팅 알고리즘.
위에 제시된 주제에 대한 라우팅은 매우 빠르지 만 대규모 주식 거래 시나리오 (수백만 개의 고유 주제, 수천 개의 구독)에서 너무 많은 메모리를 소비하는 경향이 있습니다. 이 섹션에서는 적절한 메모리 요구 사항을 가진 최적화 된 주제 라우팅 알고리즘을 소개합니다.
먼저 개별 구독을 구성 요소로 분해 해 봅시다. 주제의 첫 번째 부분, 주제의 두 번째 부분 등이 있습니다. 가장 긴 구독은 우리가 고려해야 할 부분의 최대 개수를 결정합니다. 우리가 계산 한 최대 숫자보다 많은 부분이 포함 된 메시지가 있으면 구독과 일치하지 않는다고 가정하는 것이 안전합니다. 우리는 추가 처리없이 바로 이러한 메시지를 삭제할 수 있습니다.
주제가 최대 크기를 초과하지 않는 경우 위에서 설명한 역 비트 맵 기법을 사용하여 각 개별 구성 요소를 구독의 해당 구성 요소와 일치시킵니다.
우리가 구독 & quot; trade, forex. eur, forex. * & quot;을 따르고 있다고 가정 해보십시오. 구성 성분의 최대 수는 2 :
첫 번째 구성 요소의 비트 맵 반전 :
두 번째 구성 요소의 비트 맵 반전 :
& quot; null " 각 비트 맵의 행 & quot; null " 해당 특정 구성 요소가 없다는 것을 의미합니다. 예를 들어, "거래" 제 2 구성 요소를 갖지 않으므로, null "이다.
또한 & quot; 다른 " 열. 이는 각 비트 맵의 행 수를 구독에 나타나는 구성 요소의 가능한 대체 수와 일치시키는 방법입니다. 구독에 표시되지 않는 값에 대해 새 행을 추가 할 필요가 없습니다. 예를 들어, & quot; forex. usd " 제 2 성분 " usd "이지만 구독에 언급되지 않았으므로 비트 맵에 별도의 줄이 필요하지 않습니다. 단순히 & quot; 다른 " 값.
매칭 알고리즘 자체는 쉽습니다. 메시지의 주제를 구성 요소로 분리하고, 각각의 반전 된 비트 맵에서 해당 행을 찾아 선택한 행에서 논리 AND를 수행하십시오. 이는 최대 N 개의 행이 결합 된 것을 의미하며, N은 가입의 구성 요소의 최대 수입니다. 이것은 꽤 낮은 숫자이며 아마도 10 미만입니다.
또한 모든 행에 논리적 결합을 반드시 수행 할 필요는 없습니다. 몇 개의 행을 처리 한 후에 빈 비트 맵을 얻으면 아무런 요지가없고 후속 행에 대해 AND를 수행합니다. 주제가 어쨌든 어떤 구독과도 일치하지 않습니다.
다음은 일치하는 작동 방식에 대한 몇 가지 예입니다.
메시지에 & quot; forex. eur & quot; 이야기. & quot; 외환 " 제 1 구성 비트 맵으로부터 " eur " 행을 두 번째 구성 비트 맵에서 제거하고 행에 대해 논리 AND를 수행합니다.
이제 & quot; forex. jpy " 이야기:
한 가지 예. 단일 구성 항목 ( "거래")이있는이 시간 메시지는 다음과 같습니다.
지금까지 언급되지 않은 중요한 최적화가 있습니다. 메시지의 토픽에 널 시퀀스 (예 : "forex. null. null. null. null. null")가 있으면 두 번째 및 이후 null에 해당하는 구성 요소에 대해 걱정할 필요가 없습니다. & quot; forex. null. null. null. null. null & quot; 알고리즘은 첫 번째 구성 비트 맵의 행과 두 번째 구성 비트 맵의 행을 AND해야하지만 세 번째에서 여섯 번째 구성 요소에 대한 행은 무시해도됩니다. (최적화의 정확성에 대한 증거는 독자의 연습 과제로 남아 있습니다.)
위의 최적화는 주제 트리가 불균형 한 경우 특히 중요합니다. 예를 들어, 대부분의 주제가 세 구성 요소로 구성되어 있지만 구성 요소가 100 개인 단일 주제가있는 경우 해당 주제를 등록하면 반전 된 비트 맵의 행 수가 100 개가됩니다. 따라서 위의 최적화가 없으면 각 메시지 일치에는 100 개의 비트 맵 연결이 필요하지만 99 %의 경우에는 3 연결만으로도 일치를 수행 할 수 있습니다.
필터링은 일치하는 것과 유사합니다. 단 하나의 구분은 특정 구독이 일치하는 것이 아니라 적어도 하나의 구독이 일치 하는지를 확인하려는 것입니다.
필터링은 모든 메시지가 유선을 통해 전송되고 모든 로컬 구독과 일치하지 않는 메시지를 필터링하는 수신자의 책임이있는 멀티 캐스트 시나리오에서 특히 유용합니다.
정확히 동일한 역변환 된 비트 맵 알고리즘이 사용되지만, 필터링 유스 케이스의 경우 더욱 더 최적화 할 수 있습니다.
필터링을 사용하면 기본적으로 결과 비트 맵에 적어도 하나의 비트 세트가 있는지 여부에 관심이 있습니다. 따라서 첫 번째 비트가 1이라는 것을 알게되면 나머지 비트를 평가할 필요가 없습니다. 따라서 알고리즘은 개별 구독을 왼쪽에서 오른쪽으로 평가하고 일치하는 첫 번째 구독을 발견하면 중지 할 수 있습니다.
& quot; forex. eur & quot; 위의 예 :
세 번째 구독에는 AND가 수행되지 않습니다. 이것은 약간의 도움이 될 것 같지만 많은 비트 맵이 수천 개의 구독으로 구성되어있어 많은 프로세싱을 절약 할 수 있습니다.
분명히 비트 단위로 논리 AND를하는 것은 대단히 비효율적입니다. 실제 구현에서 AND는 프로세서 데이터 버스 폭 또는 전용 SIMD 명령어로 128 개 이상의 배치에 따라 32 개 또는 64 개 서브 스크립 션이 포함 된 배치에서 왼쪽에서 오른쪽으로 수행해야합니다.
연구 아이디어.
매칭 알고리즘을 더욱 빠르게 할 수있는 몇 가지 방법이 있습니다. 보다 빠른 메시지 매칭 및 필터링을 위해 가입 / 탈퇴에 더 많은 작업을해야합니다.
한 가지 가능성은 구독을 제한하여 구독 수를 줄이는 것입니다. 필터링 사용 사례에서 " 외환 * 구독하면 & quot; forex. eur & quot; 왜냐하면 전자는 후자의 상위 집합이기 때문입니다.
또 다른 가능성은 대부분의 메시지와 일치하는 것으로 예상되는 구독을 비트 맵 왼쪽으로 이동하면서 오른쪽에서 성공할 확률이 작은 구독을 남겨 둘 수 있습니다. 필터링 유스 케이스에서 논리적 결합의 왼쪽에서 오른쪽으로의 평가와 결합하여, 대부분의 경우 초기에 성공할 알고리즘을 얻을 수 있으며, 반전 된 비트 맵의 처음 몇 컬럼을 평가 한 후 잘하면된다.
특정 구독이 일치 할 가능성이 있는지 여부를 판단하는 확실한 방법이 있습니다. 구독에 더 많은 와일드 카드 (*)가 있으면 더 큰 메시지 집합이 일치 할 수 있으므로 성공할 가능성이 큽니다. 그렇게하면 많은 수의 와일드 카드를 사용하여 구독을 왼쪽으로 이동하면서 오른쪽에 와일드 카드가 없거나 적은 수를 유지하면 매우 효율적인 알고리즘을 제공 할 수 있습니다.
결론.
위의 알고리즘을 적용하면 대량의 다양한 주제와 구독의 경우에도 나노초 또는 수십 마이크로 초 범위의 단일 메시지를 일치 시키거나 필터링 할 수있는 시스템을 제공 할 수 있다고 믿습니다.
의견 : 13.
어딘가에 페이지 / zeromq의 기사를 준비 / SUB 소켓을 사용하여 구독 할 때 메시지를 필터링 / 일치에 대한 트라이를 사용하여 준비.
이 기사에서는 주제 일치 및 메시지 필터링에 대해 설명하며 실제로 사용되는 방법을 설명합니다. 이 기사는 AMQP에만 관련이 있습니까? 아니면 제로 MQ에서도 실제로 사용됩니까? MQ가 실제로 0 MQ에서 사용되는 경우 트라이와 일치 / 필터링되는 것은 무엇입니까? 성능 차이에 대해 자세히 설명해 주시겠습니까? 왜이 필터링이 다른 것과 어떻게 다른가요? 왜 어디에서나 가장 최적화 된 필터링 / 일치가 아니십니까?
여기서 설명한 주제 일치는 매우 빠르고 유연하며 모든 종류의 일치를 처리 할 수 있지만 대기 시간이 짧은 시스템에 나쁜 새로운 주제 키가있을 때마다 많은 작업을 수행합니다. 시험은 더 간단하고보다 예측 가능한 성능을 제공합니다.
그럼에도 불구하고 나는 trie를 업데이트해야한다고 생각할 것이다. 왜냐하면 새로운 토픽이 추가되고 trie의 각 노드는 어떤 큐를 전달해야 하는지를 나타내는 비트 맵을 포함하기 때문이다.
trie (술집 및 하위 필터링 용)를 어떻게 사용 하시겠습니까?
trie가 어떻게 사용되는지 코드를 읽을 수 있습니다.
글쎄, 나는 가입자 코드에 대해 이해하고 있지만, 펍 사이드 코드에 대한 자세한 내용을 던질 수는있다.
메시지 일치의 경우 일치하는 기준의 수는 구독 당 몇 개가 있지만 메시지에는 필드 / 값의 10 초가 포함됩니다.
이 경우 필드 / 값의 대부분이 올바른 색인 표에 나타나지 않고 사용하지 못하고 시간이 낭비됩니까?
일반적으로 일치시키려는 필드는 나머지 필드와 구분하여 머리글에 넣습니다. _any_ 필드에서 실제로 일치를 허용하려면 덜 효율적인 프로세스가 있어야합니다.
오렌지. #. 노란색과 같은 구독이있는 경우. 이것을 사용하여 비트 맵을 만드는 방법은 무엇입니까?
이 기사의 설명을 읽으면 분명해야합니다.
중간에 와일드 카드가있는 구독을 추적 할 수있는 새 테이블을 추가 할 때 구현을 더 복잡하게 만들 때 처음에는 합의자를 예측할 수 없기 때문에 구현하는 동안 의미가 있습니다. 이 방법을 구현하는 쉬운 방법이 있는지 묻습니다.
기사가 설명해 ..
모든 조건에 대한 테이블을 만들려면 sub1은 주황색이고 노란색은 sub2는 apple. custard입니다. *
그래서 sub1 비트 맵은 1100이고 sub2는 0011이 될 것입니다.
그런 다음 각 메시지에 대해 비트 맵을 만듭니다.
0 0 0 0 - & gt; 1100이 아니므로 메시지가 일치하지 않으며 일치하는 필드도 없습니다.
0 0 1 0 - & gt; 0011이 아니므로 메시지가 일치하지 않지만 일치하는 필드가 하나 있습니다.
1 1 0 0 - & gt; 1100이므로 메시지는 일치하고 주문은 chk입니다.
이 알고리즘을 추가 한 후에 성능 테스트를 어떻게 했습니까? 나는 당신이 사용하는 도구가 무엇인지 의미합니다.
방금 구독을 생성 한 다음 임의의 메시지와 일치시키는 단일 스레드 테스트 사례를 실행했습니다.
글 : 2007 년 8 월 7 일 10:19.
개정 : 2012 년 4 월 17 일 11:55.
이 페이지가 유용하다고 생각되면 다른 사람들이 찾을 수 있도록 평가하십시오.
누가이 페이지를보고 있습니까?
웹 사이트 디자인 및 컨텐츠는 iMatix Corporation의 저작권 (c) 2014입니다. 전문적인 지원을 위해 저희에게 연락하십시오. cc-by-sa 3.0에 따라 라이선스가 허여 된 사이트 콘텐츠 ØMQ는 저작권 (c) 저작권 (c) 2007-2014 iMatix Corporation 및 Contributors입니다. ØMQ는 LGPL 하에서 허가 된 자유 소프트웨어입니다. ØMQ 및 ZEROMQ는 iMatix Corporation의 상표입니다. 이용 약관 & # 8212; 개인 정보 정책.
Comments
Post a Comment