메시지큐에 남은 찌거기 데이타 없애는 방법...

xian의 이미지

질문 글을 자주 올리게 되는군요..

n개 프로세스들이 메시지큐에서 데이타를 받아갈 때 랜덤으로 생성한 type을 보고 일치하면 받아가게 했습니다.
그런데 간혹 받아가는 프로세스가 죽는 등의 예상치 못한 상황이 발생되어 메시지큐에 데이타가 쌓이는 경우가 발생됩니다.

그래 일정한 간격을 두고... 그러니깐 예를 들어 3분이 지나도 메시지큐에 남아 있는 데이타가 있으면 강제로 msgrcv하는 방법도 생각해 봤는데 구현이 까다롭고 쉽지가 않더군요.. 물론 제 실력이 많이 부족한 것도 있지만..
그리고 프로세스에 여러 개의 스레드가 돌고 있는데 괜히 잘 못 수정하면 경합 등의 문제 때문에 성능 저하가 일어날거 같기도하고 ㅡ,.ㅡ;;
어렵네요...
어떻게 메시지큐에 남아 있는 특정 데이타 지우는 방법 없을까요??

eminency의 이미지

이것도 아까랑 비슷한 대답인데...ㅡㅡ
원하시는 답인지 모르겠네요.

메시지 id를 아시면 msgctl에서 IPC_RMID를 인자로 주어서 실행하면 됩니다.

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

xian의 이미지

msgctl로 해결될 문제였으면 여기 질문도 안올렸을텐데..
msgctl로 하면 메시큐자체 다 날라가는 이렇게 했다가는 큰일나겠죠..
아마도 제가 적은 글 제목만 보고 답글을 주신거 같군요. ㅎㅎ

eminency의 이미지

아, 제가 제대로 못봤네요 죄송합니다 ㅡ.ㅡ
아마 다른 큐 구현을 이용하지 않는 한 어려울 거 같네요..;

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

익명 사용자의 이미지

안녕하세요.

이미 주지하고 계시다시피, 고민하고 계신 문제를 깔끔하게 해결할 방법은 없을 것 같습니다.

문제가, 메시지 큐 내에 어떤 type의 메시지가 남아 있는지, 언제 삽입된 메시지인지...

꺼내보기 전에는 알 수 있는 방법이 없습니다.

방법이 shared memory를 사용하셔서 해당 기능을 지원하는 별도의 큐?를 구현하시거나

메시지큐의 삽입된 메시지에 대하여 type과 timestamp를 알 수 있도록 정보를 유지/관리 하는 기능을 만드셔야 할 듯 한데...

후자의 기능을 구현한다 해도 어떤 메시지를 뽑아내야 할지를 알 수는 있습니다만, 메시지를 제거하려면

다 빼내고, invaild한 건 버리고 valid한 메시지만 다시 넣는 삽질을 해야 하니...

자체구현이 거의 유일한 해결 수단으로 보입니다.

그럼 즐거운 하루 되세요. 이만...

kslee80의 이미지

없애고 싶은 메세지의 type 을 정확하게 알 수 있다면 가능할 것 같네요.

메세지 큐에서 특정 type 의 메세지가 있는지 없는지를 확인하는 방법은
msgrcv() 에서 세번째 아규먼트인 msgsz 를 0 으로 주고 호출하는 방법이 있습니다.
특정 type 의 메세지가 큐에 있다면 msgrcv() 콜이 -1 을 리턴할테고 errno 는 E2BIG 으로 셋팅되기 때문에
이런 경우에만 msgrcv() 를 이용해서 해당 메세지를 꺼내면 되겠죠.

문제라면 어디서 이런 동작을 할 것이냐가 문제가 되겠네요.

kgykingdom의 이미지

type 이 랜덤하게 생성되지만 프로세스 갯수도 있고 하니 일정 범위내에서 생산하실거 같은데.

그냥 type 범위내의 모든 값에 대해서 msgrcv(qid, buf, 0, type) 으로 점검하시면 될 것 같습니다.

xian의 이미지

역시나 조금이나마 제가 예상했던데로 쉬운 일이 아니네요 ^^;
kslee80님께서 적어 주신 방법..
"메세지 큐에서 특정 type 의 메세지가 있는지 없는지를 확인하는 방법은
msgrcv() 에서 세번째 아규먼트인 msgsz 를 0 으로 주고 호출하는 방법이 있습니다."
이런 방법이 있었는지 몰랐는데..
어떻게 할지 많이 생각했는데 답글을 보니 이제 마음 편안하네요.. ㅎㅎ
답글 참고해서 좀 더 생각해보면 어떻게 어떻게 좋은 아이디어가 떠오를거 같습니다. ^^

익명 사용자의 이미지

질문과 직접적인 연관은 없으나, 간접적으로는 관련있다는 생각에 의견을 적어봅니다.

구현시스템이 특정 목적 전용(dedicated) 시스템이라면 모를까, 커널 자원을 사용하는 메시지큐를 사용하는 것에 대해서는 저는 기본적으로 동의하지 않습니다.
특히, 대용량을 위해 커널/운영체제의 세팅을 특정 응용에 맞추어야 한다는 점과(이러한 응용은 거의 시스템을 독점해야 한다는 한계를 가진다는 생각입니다.), 메시지큐의 한계들(메시지 개수, 크기등)은 시스템 설계/배포에 제약을 많이 가한다는 생각을 가지고 있습니다.
그러나, 유닉스의 메시지큐처럼, 어떤(?) 큐메카니즘을 구현하는 것은 프로그램을 쉽고/멋지게 만들 수 있는 묘약과도 같다는 생각입니다. 물론, 유닉스 메시지큐보다는 다양하고/강력한 기능을 가져야 하겠지요!
유닉스의 메시지큐보다는, 이러한 미들웨어를 직접 만들거나, 또는 이를 구현한 기존 미들웨어를 사용하는 것이 더 바람직 하지 않을까? 라는 생각을 해봅니다.
http://en.wikipedia.org/wiki/Message_queue 에서 다양한 구현을 살펴보시면 보다 발전적이리라 생각됩니다.

개인적 생각임을 거듭 말씀드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.