그동안 consolas 를 가장 애용했었는데 아래 2개의 글꼴도 참 좋네요.


1. hack


다운로드 : https://sourcefoundry.org/hack/

위에서 다운로드 받아서 설치해도 되고, 파일 올려둡니다.

Hack-v2_013-ttf.zip


압축 해제한다음에 각각 글꼴 파일 더블클릭하면 설치되네요 (윈도우 8.x)

 






글 폭이  좀 많이 넓어지는 느낌. (개인적 취향에는 딱 맞습니다 ^^)



2. naver d2 




http://dev.naver.com/projects/d2coding

'소프트웨어 사색' 카테고리의 다른 글

객체 복제 in Polyglot  (0) 2015.11.13
jemalloc 이란?  (0) 2015.09.09
인터프리터 언어는 컴파일 언어보다 느린가?  (0) 2015.08.01
정규표현식 (Regex) 정리  (10) 2015.07.23
주요 오픈소스 라이센스  (0) 2015.06.26


Half Close 란?

 half-closed connection 을 말하는데  TCP 특성상 양쪽에서 받고 보내는 연결이 2중이 되는데 , 한 쪽만 

닫는것을 말합니다. 종료시에 보통 입력 스트림을 살리고 전송 스트림은 닫습니다. 

When shutting down a TCP connection, something curious occurs. The TCP connection is duplex: data flows in both directions. And it's created in this manner -- it is impossible to create "half" a TCP connection, that would let data flow only from one end to the other. The SYN/ACK handshaking creates both directions at once or fails. Of course, your program might use the TCP connection to stream data in only one direction. But both directions are there...

When closing the connection, something else occurs. A party wishing to close its side of the TCP connection sends a FIN (i.e. a header with this bit set, along with any of the usual ACKs etc.). Like a SYN at the beginning of the connection, the FIN consumes a TCP sequence number, so it can be ACKed. And after the other party ACKs, the connection is half-closed! The party which sent the FIN can no longer send data -- but the other party may continue to send data.To close the TCP stream fully, both sides must send a FIN for "their" half of the connection. What possible use is a half-open connection?

In fact, a great deal of use. TCP streams share a great deal of intended functionality with UN*X pipes. In particular, it is often useful to think of sending a FIN in the same way as sending an EOF to the other side. Many processes can only compute their output after they finish reading their input. If you wish to connect such a program to a TCP stream, you'll need to denote the end of input in some manner -- and that manner is TCP's FIN.

For instance, suppose we have a program md5sum which computes the MD5 checksum of its input. md5sum reads its entire input, and only then generates output. Suppose further I have a file xyzzy on machinealice, and the program md5sum on machine bob. How can I compute the checksum?

alice% rsh bob md5sum < xyzzy

does the trick.

md5sum cannot produce any output until it knows its read all its input. Thus, no application data will flow from bob to alice until alice sends FIN. As soon as alice sends FIN, rsh on bob knows that its standard input has ended, and closes md5sum's input. Now md5sum can output its application data, which is transmitted on the half-open side of the TCP stream. Immediately following this data comes bob's FIN, closing the other half of the connection.

Without the TCP's half-close, some out of band data would have had to be used, significantly complicating TCP. A half-closed pipe is useful.

http://everything2.com/title/TCP+half-close


'Network' 카테고리의 다른 글

keepalive 란?  (0) 2015.07.22
SSH 터널링 상세이론  (0) 2015.07.14
홀펀칭 기초  (0) 2015.07.14
와이파이로 기기간 연결 강화한다  (0) 2015.06.11
모바일기기 wifi의 ip주소를 수동으로 설정하기  (0) 2015.06.11


JAVA OIO


그림에 있는 순서대로 흘러가면 됩니다.

- 서버쪽에서는 Accept 를 통해 클라이언트의 접속을 기다리며 

- 접속이 되면 , 해당 클라이언트만을 위한 쓰레드를 생성합니다.

- 그 후 클라이언트는 그 쓰레드와 통신을 하게됩니다.

- 결국 클라이언트 만큼 쓰레드가 서버에 생성됩니다.


JAVA NIO



- 위 그림의 Java NIO 서버는 Hadoop 이라는 오픈소스 코어에서 가져왔습니다.

- 클라이언트측은 OIO (Old Input/Output) 이며, 서버는 NIO (New input /output) 입니다.

- 셀렉터, 채널 , 바이트버퍼의 개념을 알아야 이해할수있습니다.

- 보시다시피 굉장히 복잡하기때문에 , 스스로 만드는것 보다는 오래 검증된 라이브러리 (Netty) 같은것을
  사용하는편이 안전합니다.

- 클라이언트와 쓰레드 갯수와 무관해집니다. 


위의 그림은 오프라인 스터디용으로 작성하였기때문에, 여기에 구체적인 설명은 하지 않겠습니다.  ^^


P.S

TCP 는 연결지향이지만 메세지의 끝이 불분명하기때문에 양측에서 메세지의 처음과 끝을 약속하여 처리합니다.

- 문자열을 보낼때, 라인단위로 보냅니다. 그러면 수신측에서는 /n 을 발견할때까지 읽어서 처리합니다.

- /n 를 하나의 메세지의 끝으로 약속했을때, 메세지 안에 바이너리 데이터가 있다면 Base64 등으로 문자인코딩함.

- 처음 4바이트를 읽어서, 메세지의 길이를 확인한후에 길이만큼 바이트를 읽습니다.  ( 위에 하둡에서 이렇게 처리) 

- sync:cmd:datal-length:-------- data ------------:endSync  이런식으로 완전한 패킷정의 


스택오버플로우에 이희승씨가 요렇게 남겼네요.


- 3.x 은  deprecated 되었습니다. 유저들이 아직 많이들 사용하니깐 유지보수는 해드려요.

- 4.0 는 현재 안정화 버전입니다. 먼가 의심스러우면 요걸 쓰세요.

- 4.1 는 4.0 의 하위호환버전입니다.  몇가지 쩌는 것들을 추가했는데요. HTTP/2 나  asynchronous DNS resolver 같은거 말이죠.  그래서  4.1 은 이미 님의 어플이 4.0에서 돌아간다면 새버전으로 바꾸시는게 어떨까 하네요.

- 5.0 은 하위호환되지 않는 버전입니다.이건 4.0 처럼 rewrite 된건 아닌데요. 몇가지 디자인 결함을 바로 잡았습니다. Netty4 를 사용하고계시다면 Netty5 로 바꾸려면 몇가지 코드를 수정해야합니다.그건 Netty 3 을 Netty4 로 포팅하는것과는 다릅니다. 결국 4.x 도 deprecated  될것이고 5.0이 안정화 버전이 되겠지요.





4.0 의 주요 새로운점 


1. Buffer API changes


* ChannelBuffer  ByteBuf

- 패키지가 분리되었고 네티를 쓰지 않더라도 독립적으로 buffer API 를 쓸수있도록 하였다.그에 따라  이       름이 바뀌었다. 

- 새로운 버퍼를 생성하는 ChannelBuffers 는  Unpooled  과 ByteBufUtil 두개의 유틸리티 클래 스로 나뉘었으며, 이름에서 나타나듯이 4.0에서 새로 만들어진 풀링기능을 가진 ByteBufs가 
ByteBufAllocator  에 의해  만들어진다.

* ByteBuf is not an interface but an abstract class

* Most buffers are dynamic with maximum capacity


- 3.x 에서는 고정/동적 버퍼가 있었는데, 4.0 이래로는 모든 버퍼가 동적이 되었다. 또한 이전의 동적버퍼들보다

 더 나아졌다. ByteBuf.capacity(int newCapacity) 때문에 줄거나 늘어나는 작업을 하기 쉬워졌다.

 단 wrappedBuffer 로 생성된것은 예외다.

// No more dynamicBuffer() - use buffer().
ByteBuf buf = Unpooled.buffer();

// Increase the capacity of the buffer.
buf.capacity(1024);
...

// Decrease the capacity of the buffer (the last 512 bytes are deleted.)
buf.capacity(512);

 * Pooled buffers

  Netty 4 는 고성능 버퍼풀을 제공하며 jemalloc 의 다른 버전으로  buddy allocation 과 slab allocation 를 
   결합시켰습니다.  이것을 이용하면 좋은점은 

  • 버퍼에 대한 빈번한 메모리 할당/해제로 일어나는 GC 의 부담을 덜수있습니다.
  • 새로운 버퍼를 만들때 일어나는 메모리 대역소비를 줄였습니다. 새버퍼를 만들때는 필연적으로 0 를 채우죠.
  • 다이렉터 버퍼의 해제를 적시에 일어나게 합니다.

만약 사용자가 풀되지 않는 버퍼를 얻길 원치 않는다면, ByteBufAllocator 로 부터 버퍼를 가져오면 됩니다.

Channel channel = ...;
ByteBufAllocator alloc = channel.alloc();
ByteBuf buf = alloc.buffer(512);
....
channel.write(buf);

ChannelHandlerContext ctx = ...
ByteBuf buf2 = ctx.alloc().buffer(512);
....
channel.write(buf2)

일단 ByteBuf 가 리모트 피어로 쓰여지면 자동적으로  버퍼를 가져온 풀로 회수됩니다.

디폴트  ByteBufAllocator  는 PooledByteBufAllocator.만약 이것을 쓰기 원치 않으면 Channel.config().set

Allocator(...) 를 통해 원하는것을 넣어주면됩니다.UnpooledByteBufAllocator 이런거 말이죠.

노트:  현재 기본할당자는 UnpooledByteBufAllocator 입니다. 메모리릭의 존재가 확인되지 않는다면 

PooledByteBufAllocator 가 디폴트로 사용될것입니다.


ByteBuf 는 항상 레퍼런스 카운트 기능이 사용됩니다.


ByteBuf 의 더 예측가능한 생존싸이클을 컨트롤하기위해 Netty 는 더이상 가비지컬렉션에 의존하지 않고 레퍼런스 카운터를 사용합니다. 기본적인 룰은 :

  • 버퍼가 할당되면 레퍼런스 카운트는  1 입니다.
  • 레퍼런스 카운트가 0 이되면 해제되며  풀로 되돌아갑니다.
  • 다음은 IllegalReferenceCountException 를 일으킵니다.

    • 레퍼런스 카운트 0 인 버퍼로의 접근
    • 마이너스 값으로 레퍼런스카운트 변경 
    • Integer.MAX_VALUE 이상으로 레퍼런스카운트 증가
  • Derived buffers (e.g. slices and duplicates) 와  swapped buffers (i.e. little endian buffers) 는 그것을 생성하기위해 사용한  버퍼와 레퍼런스 카운트를 공유합니다. 


ByteBuf 가 ChannelPipeline 에서 사용될때 추가적인 룰이 있는데 명심하십시요.

  • 각각의 파이프라인안의 인바운드 ( upstream ) 핸들러는 받은 메세지를 릴리즈 해야합니다. 네티는 자동적으로 릴리즈 해주지 않아요.

    • 노트: 코덱 프레임워크는 자동적으로 릴리즈 합니다. 그리고 유저는 만약 다음 핸들러로 메세지를 넘겨주고 싶을때는 반드시 레퍼런스카운트를 증가시켜줘야합니다.
  • 아웃바운드 (downstream) 메세지가 파이프라인의 끝에 도달하면 네티는 쓰고나서 릴리즈합니다.


   자동 버퍼 릭 탐지

레퍼런스 카운팅이 강력하더라도 에러가 발생하기 쉽습니다. 버퍼를 해제하는것을 까먹을수가 있는데 이때 릭 탐지기는 로그를 써줍니다. 릭 탐지기는 PhantomReference 과 스택트레이스를 얻기때문에 높은 성능낭비를 가져올수있기때문에 릭을 발견하기위해 오랫동안 돌려본후에 기능을 꺼야합니다.

 -Dio.netty.noResourceLeakDetection  JVM 옵션으로 끌수있습니다.


2. Channel API changes




4.1 의 주요 새로운점 







5.0 의 주요 새로운점 

http://netty.io/wiki/new-and-noteworthy-in-5.0.html 정리중 




  1. 생산자 (Sender) 테스트 

    1. 결과 
    2. 이유
      1. 카프카 생산자는 브로커로 부터의 ack 를  기다리지 않고 메세지를 보낸다.브로커가 핸들링 할수있는 만큼 빠르게 메세지를 마구 보낸다.
      2. 카프카는 좀더 효율적인 저장소 포맷을 가지고있다. 평균적으로 카프카 각 메세지들은 9byte 의 오버헤드를 가지며, 반면 ActiveMQ 에서는 144 bytes 를 가진다. 이것은 메세지 헤더때문인데  JMS 에 의해 요구되어진것과 다양한 인덱싱구조를 유지하기위한 것이다. LinkedIn 은 관찰하길  ActiveMQ 의 가장 바쁜쓰레드는 메세지 메타데이터와 상태를 유지하기위한 B-Tree 에 접근하기위해 대부분의 시간을 소비하는것을 발견했다.

  2. 소비자 (Receiver) 테스트

    1. 결과

    2. Reason
      1. 카프카는 좀더 효율적인 저장소 포맷을 가지고있다. 브로커로부터 컨슈머로 데이터 이동시 아주 적은 바이트만 소비된다.
      2. ActiveMQ 와  RabbitMQ 의 브로커는  모든 메세지에 대한 전달 상태를 유지해야한다. LinkedIn 팀은 ActiveMQ 쓰레드들 중 하나를 관찰했는데  KahaDB 페이지를 디스크에 쓰는데 매우 바쁜걸 발견했다.  대조적으로 카프카 브로커상에서는 디스크 쓰기 행위가 없다. 결론적으로 파일에 쓰는 API 를 사용하는것에 의해 카프카는 데이터이동에 관한 오버헤드를 감소시킬수있던것이다.



RabbitMQ는 push모델이고,
 Kafka는 pull 모델이다. RabbitMQ는 prefetch limit라는 소비자측 옵션으로 배압(Back pressure)을 관리하고, Kafka는 소비자가 데이터를  알아서 offset을 통해 땡겨오면서 관리한다. 

Kafka)

- 초당 100k+ 이상의 불같은 이벤트를 처리하려면 이용해라. 
- 온라인이나 배치로 파티션된 순서로 적어도 한번은 배달될 필요가있을때
- 메세지를 다시 읽을 필요가 있을때도 사용해라. 또한 노드레벨 HA 로 흐름제한을 다룰수있을것이다.

RabbitMQ) 

- 초당 20+ 메세지를 복잡한 방식으로 컨슈머에게 라우트하고 싶을때 사용하라. 
- 메세지당 전달보장을 해줄필요가 있을때 사용하라. 
- 배달 순서는 별로 관여치 않을때 사용하라. (순서를 보장하게도 할수있다) 
- 클러스터 노드레벨의 HA 가 필요할때 사용하라.

둘다 쩌는 " Filter / Query"  능력을 제공하지는 않는다. 그러기위해서는 Storm 을 아키텍처에 추가하라


RabbitMQ vs. Kafka

둘다 쩌는 솔루션이다.  
-  RabbitMQ 가 좀더 성숙하다. (Written 12 Sep, 2012)
철학은 좀 다른데, 기본적으로 RabbitMQ 는 브로커 중심적이며, 생산자와 소비자간의 보장되는 메세지 전달에 촛점을 맞추었다.  
- 반면 Kafka 는 생산자 중심적이며, 엄청난 이벤트 데이터을 파티셔닝하는데 기반을 둔다. 배치 소비자를 지원하며, 온라인, 오프라인에 저 지연율(Low latency)을 보장하며 메세지를 전달해준다. 
-  RabbitMQ 는 브로커상에서 전달 상태를 확인하기위한 메세지 표식을 사용한다. 카프카는 그런 메세지 표식이 없으며 컨슈머가 전달(배달) 상태를 기억하는것을 기대한다. 
- 둘다 클러스터간의 상태를 관리하기위해 Zookeeper 를 사용한다. 
- RabbitMQ 는 커다란 크기의 데이터를 위해 디자인되지 않았으며 만약 컨슈머가 매우 느리다면 실패할것이다.그러나 post 2.0 에  RabbitMQ  는 느린 배치 컨슈머를 핸들링 되는게 요청되어졌다.  
-  Kafka 은 오직 토픽같은 exchanges 를 사용한다. RabbitMQ 는 다양한 exchanges 를 사용한다. 토픽/큐 등
-  Kafka 는 파티션들 안에서 메세지 순서를 제공하며, 파티션들간에 엄격한 순서를 가진다. 카프카 컨슈머들은 충분히 스마트해야하며 , 그들 스스로 파티션간의 순서를 해결(resolve) 해야한다.
- Kafka 는 디스크상에서 메세지를 저장하고 데이타 손실을 막기위해 클러스터로 그들을 복제한다. 각각의 성능에 큰 문제없이 브로커는 테라바이트를 핸들링할수있다. Kafka 는 쓰기에 초당  200k 메세지를 , 읽는데는 3M 메세지를  제공되도록 테스트되었다.



이 글은 2015년에 쓰여졌는데, 이전에 ESB (JBoss Fuse, Mule ESB등) 시대에는 "똑똑한 브로커에 멍청한 엔드포인트" 였다면 2020년 현재 마이크로서비스 시대인 만큼 "멍청한 브로커에 똑똑한 엔드포인트" 가치에 적합한 비동기 브리징 모델인 Kafka는 블록체인을 포함한 다양한 분야에서 대유행하고 있으며 Apache pulsar 라는 대항마도 등장했었다. MQ시장에서 Kafka가 압도적으로 사용되는 측면에는 ( 물론 RabbitMQ와 Kafka는 트레이드 오프관계로 사용 용도가 다를 수 있다. 개인적으로는 다양한 어플리케이션의 Integration 용도면 RabbitMQ/ActiveMQ/JBoss AMQ에 조금 성격은 다르지만 Camel 인데 그 이외의 용도는 모두 카프카로 대동단결하는 듯) 먼가 어렵고 귀찮은 표준(JMS, AMQP, MQTT,XMPP)같은 것과 똑똑한 브로커의 기능셋을 신경 안써도 되는 간단한 느낌?? (exactly-once 근본적문제 제외) 그리고 헤더 및 메터데이터 필요 없이 간단한 key,value기반의 pub/sub이면 충분해 받아서 쓰는건 내가 알아서 관리 할께~!! COM+/CORBA/웹서비스가 어려워서 쪼그라들고, 좀 더 쉽다는 SOA(ESB,SOAP)도 생각보다 어려워서 쪼그라든것 처럼... 누군가에겐 너무 허접한 기술인 HTML/JSON처럼 역시 세상은 쉬운 것으로 대동단결하나보다.

Kafka말고 RabbitMQ나 ActiveMQ를 꼭 써야하는 경우에 대해서 정리하면 아래와 같다.


레퍼런스)

http://mungeol-heo.blogspot.kr/2015/01/kafka-vs-rabbitmq-vs-activemq.html  
http://prismoskills.appspot.com/lessons/System_Design_and_Big_Data/Chapter_12_-_RabbitMQ_vs_Kafka.jsp
http://prismoskills.appspot.com/lessons/System_Design_and_Big_Data/Chapter_12_-_RabbitMQ_vs_Kafka.jsp
https://suniphrase.wordpress.com/2015/05/07/messaging-system-comparison-kafka-vs-rabbitmq-vs-activemq/



Friday, January 2, 2015


역주: 메세지큐에 대한 글을 적기 전에 왜 메세지큐냐? 를 먼저 생각해봐야한다.

메세지큐는 그냥 메세지를 전달해주는 서버인건데, 기술자체에 집중할 필요는 나중에 생각해보고 , 처음 생각해볼것은 왜 메세지를 전달하냐인데.. 이것의 가장 큰 이유는 행위(메세지)를 분산시키기 위함이라고 볼수있다. 말이 좀 어려운거 같은데 쉽게 말하면  대부분의 경우 하나의 일을 하기위한 프로세스에서는 쓸 필요가 없다는 뜻이고 , 어떤 행위에 대한 프로세스가 여러갈래인 경우에 사용하면 된다. 예를들어 브라우저에서 사용자가 버튼은 클릭했을때, 서버에 전달된 행위를 디비에 전달하고 바로 리턴해주는게 하나의 프로세스이라고 보면, 그 행위를 다른곳으로 전파시킬 필요가 있을때 메세지큐를 사용한다. 

실질적인 예로는 소셜서버에 글을 올렸을때, 내가 글을 올린것을 즉시 확인해야하는 나 자신을 위한 프로세스는 가장 우선되야하며, 내가 올린글이 다른사람에게 전달(feed) 되기 위한 시간은 즉시가 아니어도 된다. 그때 처음 버튼을 눌렀던 행위를 메세지큐에 던저넣고 바로 리턴한후에 나 자신을 위한 프로세스가 즉각적으로 응답되게 하는것이다. 

또 다른 예로는 IoT 엣지디바이스가 데이터를 생성하면 그 데이터를 메인 스트리밍을 따라서는 즉각적으로 사용자한테 전달되며 , 또다른 갈래로는 스톰같은 실시간 분석도구 라든지, 다른 서버로 보내는데 사용할수있다는것이다. 역시 행위(메세지) 를 여러갈래로 분산시킨다고 보면된다.



Hello World!




 * 메세지를 차례로 보내면 차례로 받는다. 





Work Queues

Distributing tasks among workers (the competing consumers pattern) (워커에게 하나씩 균등히 나누어 준다)

Round-robin dispatching


메세지를 하나의 큐에 보내면 , 소비자들이 하나씩 사이좋게 나누어 갖는다.
* 보내는쪽은 하나 받는쪽은 여러개

Fair dispatch



메세지를 하나의 큐에 보내면 , 소비자들이 나누어갖는데, 시간배분을 해준다. (위처럼 라운드로빈이라면 홀수로 받는 워커에 일이 가중될수도있다. 홀수로 보내지는 일이 항상 많을경우) 

Publish/Subscribe

Sending messages to many consumers at once (모든 소비자에게 다 준다) 

Exchanges


 * Exchanges 를 통해 여러개의 큐에  보낸다.  

 * 워커큐와 다른점은 워커큐는 항상 하나의 메세지는 하나의 컨슈머만 받을수있다는것이고, 

   생산자/소비자 패턴에서는 하나의 메세지를 여러 워커가 받을수있다라는 점. 

Bindings


Putting it all together



Routing

Receiving messages selectively (원하는 것을 가져가게 한다)

Direct exchange

 * Exchanges 를 통해 여러개의 큐에  구분하여  보낸다.  예를들어 한쪽은 크리티컬하여 하드에 저장될필요가있는것들이고 하나는 그냥 콘솔에 보여지고 버리는 로그 메세지들.

Multiple bindings



Putting it all together



Topics

Receiving messages based on a pattern (topics) (특정 패턴에 기반해 나누어 가진다) 

Topic exchange





RPC

Request/reply pattern




레퍼런스: https://www.rabbitmq.com/getstarted.html  


MongoDB vs. Couchbase  (2)


 

Couchbase 의 문서는 JSON 인 반면  MongoDB 문서는 BSON 이다. 표기법은 많은 32비트 , 64비트 Integer 타입, 날짜타입, 바이트배열등을 포함한다. 양쪽은 모두 위치분석 데이타/쿼리를 지원하는데 카우치베이스는 아직 실험중이며 곧 완성될것이다. 2.4 새 몽고디비 버전에서는 풀 텍스트 검색이 포함되었으며 카우치베이스는 유사한 기능이 있는데 elasticsearch 플러그인이 필요하다.


카우치베이스와 몽고디비는 둘다 복제를 통한 데이타 안전을 제공하며, 둘다 클러스터링을 한다. 또한 둘다  샤딩을 통한 병렬접근을 제공한다. 카우치베이스와 몽고디비는 해쉬샤딩은 제공하는데 몽고디비는 범위샤딩 과 "태그" 샤딩도 제공한다. 이것은 양날의 칼인데 , 데이타베이스 관리에 유연함을 주는 동시에 오용은 클러스터에 밸런스를 깨지게하는 결과를 초래한다.


맵리듀스는 양쪽에 주요툴인데, 다른 목적으로 사용된다. 몽고디비에서는 일반적인 데이타 프로세싱, 정보집단화, 분석등을 위해 사용하며, 카우치베이스는 단지 데이타베이스를 쿼리하기위한 인덱스 생성용도로 사용한다. 그 결과 몽고디비가 인덱스 생성이나 애드혹 쿼리시엔느 좀 더 쉽긴하다.


카우치베이스는 메모리에 캐쉬하는것 (memcached) 이 장착되있는데,  몽고디비에는 대응되는것은 없다. Memcache 는  높은 처리량/데이타 집중 인터넷/ 인프라넷 어플리케이션 을 위해 오프젝트를 캐슁하는 시스템으로 강력하다. 만약 어플리케이션에서 Memcache 기능이 필요하다면 더 볼것도 없이 Couchbase 이다. 


두 시스템은  여러 유명 언어로 드라이버와 클라이언트 프레임워크를 제공하며 , 오픈소스이며 쉽게 인스톨할수있고 쉽게 온라인에서 문서를 찾을수있다. 


Couchbase Server vs MongoDB 

 

문서 조작 

Couchbase 는 2.0에서 원래 key/value 저장 아키텍처에서 문서형 특징을 추가 되었고  , MongoDB 는 원래 문서기반으로 디자인되었다. 몽고디비가  좀 더 개발되어졌다.

인덱싱 

Couchbase, 에서는 mapreduce 로 추가 인덱스를 만들어야하고 MongoDB, 에서는 개인적인 문서 필드에 인덱스를 추가할수있다. 몽고디비의 맵리듀스는 일반적인 프로세싱 용이다.

Memcached

Couchbase  는 Memcached 컴포넌트를 포함하며 , 문서저장용도와 독립적으로도 사용가능하며,  MongoDB 는 대응되는 부분이 없다.

샤딩 

Couchbase  는 hashed sharding 만 지원. MongoDB 는 hashed sharding 과  range sharding 지원.

Geospatial

MongoDB 는 geospatial 를 잘 지원하고 Couchbase 도 마찬가지인데 2.0 부터 추가되었고 발전중이다.


+ Recent posts