위챗 푸시 메시지 배중 해결 방법

5173 단어
위챗 공중 플랫폼 개발 시 위챗 메시지 전송 메커니즘은 전송 후 5초 안에 응답을 받지 못하면 전송에 성공하지 못하면 다시 전송하고 5초 안에 응답을 받지 못하면 계속 전송하며 총 세 번 전송한다.
위챗 문서 원문:
일반 메시지
1. 재시도에 대한 메시지 배중, msgid 배중을 추천합니다.
2. 위챗 서버가 5초 안에 응답을 받지 못하면 연결이 끊어지고 요청을 다시 시작합니다. 총 세 번 다시 시도합니다.만약 서버가 5초 안에 처리하고 회답할 것을 보장할 수 없다면, 빈 문자열에 직접 회답할 수 있으며, 위챗 서버는 이것에 대해 어떠한 처리도 하지 않을 뿐만 아니라, 다시 시도하지 않을 것이다.
 
이벤트 푸시:
위챗 서버가 5초 안에 응답을 받지 못하면 연결이 끊어지고 요청을 다시 시작합니다. 총 3회 다시 시도합니다.
재시도에 대한 메시지 배열에 대해서는 FromUserName + CreateTime 배열을 사용하는 것이 좋습니다.
만약 서버가 5초 안에 처리하고 회답할 것을 보장할 수 없다면, 빈 문자열에 직접 회답할 수 있으며, 위챗 서버는 이것에 대해 어떠한 처리도 하지 않을 뿐만 아니라, 다시 시도하지 않을 것이다.
 
 
내 솔루션:
1. 중복 메시지를 판단하는 Duplicate Removal Message 클래스 만들기;
2. 위챗이 전송한 메시지 해석 값을 Duplicate Removal Message 대상의 실례에 부여한다.
3. 정적 변수list를 캐시로 삼아 Duplicate Removal Message의 실례가 캐시list에 존재하는지 판단하고 존재하면 중복 메시지, 존재하지 않으면 중복 메시지가 아닌 메시지를 캐시list에 저장합니다.
 
이 시나리오의 문제점:
1. 캐시list는 무한히 커지기 때문에 setMessage ToCache 방법으로list의 최대 용량을 1000으로 제한합니다.
2.list의 최대 용량은 여전히 폐단이 있다. 즉, 두 개의 중복된 메시지 사이에 999개가 넘는 Duplicate Removal Message 대상이 있으면 여전히 판단이 정확하지 않고 list 용량을 늘려서 완화할 수 밖에 없다. 이런 상황은 극단적이기 때문에 현재는 그렇게 큰 업무량이 없기 때문에 잠시 이렇게 사용한다.
 
여러분은 어떤 좋은 해결 방안이 있는지 함께 교류하고 벽돌을 찍는 것을 환영합니다.
 
다음은 구현 코드입니다.
참고: 1.다중 스레드 호출 상황을 고려하고, 방법에synchronized
   2.DuplicateRemovalMessage 해시코드, equals 복사 방법 잊지 마세요
 
private static final int MESSAGE_CACHE_SIZE = 1000;
	private static List<DuplicateRemovalMessage> MESSAGE_CACHE = new ArrayList<DuplicateRemovalMessage>(MESSAGE_CACHE_SIZE);

	/**
	 * @Description:  
	 * @return boolean  true
	 */
	public static synchronized boolean isDuplicate(Map<String, String> request) {
		String fromUserName = request.get("FromUserName");
		String createTime = request.get("CreateTime");
		String msgId = request.get("MsgId");

		DuplicateRemovalMessage duplicateRemovalMessage = new DuplicateRemovalMessage();

		if (msgId != null) {
			duplicateRemovalMessage.setMsgId(msgId);
		} else {
			duplicateRemovalMessage.setCreateTime(createTime);
			duplicateRemovalMessage.setFromUserName(fromUserName);
		}

		if (MESSAGE_CACHE.contains(duplicateRemovalMessage)) {
			//  , pass
			return true;
		} else {
			setMessageToCache(duplicateRemovalMessage);
			return false;
		}
	}
	private static void setMessageToCache(DuplicateRemovalMessage duplicateRemovalMessage) {
		if (MESSAGE_CACHE.size() >= MESSAGE_CACHE_SIZE) {
			MESSAGE_CACHE.remove(0);
		}
		MESSAGE_CACHE.add(duplicateRemovalMessage);
	}

 
 
DuplicateRemovalMessage 객체:
 
public class DuplicateRemovalMessage {

	private String MsgId;
	
	private String FromUserName;
	
	private String CreateTime;

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((CreateTime == null) ? 0 : CreateTime.hashCode());
		result = prime * result + ((FromUserName == null) ? 0 : FromUserName.hashCode());
		result = prime * result + ((MsgId == null) ? 0 : MsgId.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		DuplicateRemovalMessage other = (DuplicateRemovalMessage) obj;
		if (CreateTime == null) {
			if (other.CreateTime != null)
				return false;
		} else if (!CreateTime.equals(other.CreateTime))
			return false;
		if (FromUserName == null) {
			if (other.FromUserName != null)
				return false;
		} else if (!FromUserName.equals(other.FromUserName))
			return false;
		if (MsgId == null) {
			if (other.MsgId != null)
				return false;
		} else if (!MsgId.equals(other.MsgId))
			return false;
		return true;
	}

	
	public String getMsgId() {
		return MsgId;
	}

	public void setMsgId(String msgId) {
		MsgId = msgId;
	}

	public String getFromUserName() {
		return FromUserName;
	}

	public void setFromUserName(String fromUserName) {
		FromUserName = fromUserName;
	}

	public String getCreateTime() {
		return CreateTime;
	}

	public void setCreateTime(String createTime) {
		CreateTime = createTime;
	}
	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("DuplicateRemovalMessage [MsgId=");
		builder.append(MsgId);
		builder.append(", FromUserName=");
		builder.append(FromUserName);
		builder.append(", CreateTime=");
		builder.append(CreateTime);
		builder.append("]");
		return builder.toString();
	}

}

 
 

좋은 웹페이지 즐겨찾기