깔샴이
441
2020-05-02 23:20:52 작성 2020-05-02 23:21:11 수정됨
2
389

503에러에 대해


안녕하세요.

현장에 설치되어 있는 장비에서 통신서버(외부망:인터넷 되는 환경)에 있는 통신 프로그램을 통해 데이터를 받은 후 웹 호출을 통해 DB(내부망:인터넷불가)에 데이터를 저장하고 있습니다.

여기서 웹 호출이라는건 웹프로그램 자체에 아래에 있는 자바 소스와 같이 특정 URL로 요청코드 및 요청값이 JSON형태로 넘어오게 되면 조회 결과를 통신프로그램으로 리턴해준다든지 DB에 저장하고 있습니다.

통신 프로그램에서 직접 DB에 데이터를 저장하면 좋으나 기관 정책으로 인해 통신 프로그램에서 직접 DB에 데이터를 저장할 수 없고 DB 서버와 같은 내부망에 위치한 WAS서버(JEUS)를 통해서만 DB접근이 가능하여 통신 프로그램에서는 특정 웹URL을 통한 웹 호출을 통해 데이터를 저장 및 필요 정보를 가져오고 있습니다.

문제는 통신 프로그램에서는 초 단위로 특정 데이터를 요청하거나 DB저장 하기 위해 웹 호출을 하기 때문에 웹 부하가 심해진다는 겁니다.

시스템 구축한 건 몇개월 지났고 기관 서버가 이중화 되어있는데 주기적으로 1달 하고 3,4일 정도 경과 하면 어김없이 웹 접속하면 503에러가 발생해 있습니다. 신기한 건 서버가 이중화되어 있어 그런지 웹만 접속이 안되고 데이터 수집은 정상적으로 되었습니다^^;

그럴땐 항상 WAS서버 유지보수 업체에 WAS 재시작 요청을 해서 정상적으로 웹 접속이 되도록 조치를 취하고 있습니다. WAS재시작을 하면 한달은 괜찮으니 정말 단순히 일시적인 현재 상황을 모면하기 위한 일시적인 조치죠^^;;

웹 로그를 보면 특별한 에러도 발생해 있지 않고

테스트 장비 한두대로는 똑같은 증상이 발생하지 않아 현재 어떻게 조치를 취해야 할지 맨붕 상태입니다.

기관 서버 유지보수 업체라던지 JEUS 유지보수 업체에 어떤 부분을 요청해야 할지도 현재 막막하고

통신프로그램에서 웹 호출을 통해 DB조회 및 저장하도록 하는 방식이 애초에 잘못 된건 아닌가 싶기도 하고

웹 호출과 웹 프로그램을 따로 따로 WAS 나눠 구축 하면 낫은건지... 단순히 WAS 힙메모리를 현재 1024에서 2048MB로 늘려달라고 요청하면 해결 되는 문제인지...

여기서 질문입니다.

1) 통신프로그램은 외부망에 위치하고 DB는 내부망에 위치하고 있을때 위와 같이 중간에 웹호출프로그램(JSP)을 둬서 구축하는게 일반적인 건지요?
2) 위와 같이 웹 프로그램을 개발할 때 웹 접속시 503에러가 발생하지 않게 하기 위해 개발시 고려해야할 사항은 무엇이 있을런지요?
3) 이런 상황에 여러분 들이라면 먼저 어떤 부분을 체크해서 조치를 취할거 같은지요?
4) 그리고 이런 유사한 현상이 발생해서 어떻게 조치한 적이 있는지요?
5) 기타 도움이 될 정보 있음 부탁드립니다.

참고로 웹프로그램은 전자정부프레임워크(JSP) 사용해서 개발하였고 DB는 ORACLE 사용하고 있습니다.

웹 개발자가 저 혼자라 회사에 조언 받을 사람이 없습니다.

위의 다섯 가지 질문에 대한 답변 다 안주셔도 괜찮습니다.

한가지라도 조언 해주실 내용 있으시면 어떤것이라도 답변 부탁드립니다.

감사합니다. 


<통신프로그램에서 웹호출시 JAVA기능 일부 내용>
/**
 * 정보 요청한다.
 * @param request application/json 요청값
 * @param model
 * @return 결과값
 * @exception Exception
 */
@ResponseBody
@RequestMapping(value = "/webCall/selectWebCall.do", produces = "text/plain;charset=utf-8")
public String selectWebCall(HttpServletRequest request, ModelMap model) throws Exception {
String result ="";
StringBuffer json = new StringBuffer();
String line = null;
BufferedReader reader = request.getReader();
while((line= reader.readLine()) != null){
json.append(line);
}
JSONParser paser = new JSONParser(); //JSON Parser객채를 만듭니다. 
JSONObject obj = (JSONObject) paser.parse(json.toString()); //Parser로 문자열 데이터를 JSON데이터로 변환합니다.
String req = (String) obj.get("REQ");// REQ받아오기
WcDefaultVO searchVO = new WcDefaultVO();
JSONObject jsonObject = new JSONObject();

/*
 * 테스트 용 END
 */
if(req != null){
//1. REQ : 1010
if(req.equals("1010")){
//요청 결과 조회 또는 데이터 등록
}
}
0
  • 답변 2

  • B급 개발자
    807
    2020-05-03 22:30:11

    1. 연계용(수집용) 어플리케이션과 서비스용 어플리케이션을 분리하는 것이 더 괜찮을 듯합니다. (하지만 이것은 이중화 및 관리 포인트 추가로 인한 비용 발생을 고려해야 합니다)

    2. Java WAS는 GC의 작동에 의해 일시적으로 트래픽이 과도하게 몰리지 않는 이상 갑자기 죽지는 않습니다. 503 에러가 났다는 것은 어플리케이션이 다운 상태이거나 좀비라는 얘기인데요. 이것이 한달 주기로 나타난다고 하니 뭔가 좀 수상하네요. 먼저 매달 어떤 이벤트가 일어나는지 확인해 보시는 것이 좋을 것 같습니다. 만약 특별한 이벤트가 없다면 메모리 누수 현상을 의심해 보시는 것도 좋을 것 같습니다. 확인 하시려면 힙 덤프를 보시면 됩니다.

    3. 마지막으로 체크해 봐야 할 것은 머신의 상태입니다. 볼륨(디스크) 사이즈는 충분한지 불필요한 로그를 과도하게 쌓고 있는 것은 아닌지 등이 있겠죠

  • 깔샴이
    441
    2020-05-06 02:14:36 작성 2020-05-06 02:18:42 수정됨

    답변 감사합니다.

    많은 도움 되었습니다.

    1번은 지금 당장 대응하기 어려울꺼 같고

    우선 2,3번 관련해서 체크해보도록 하겠습니다.



  • 로그인을 하시면 답변 을 등록할 수 있습니다.