Firebase에서 채팅과 같은 "대화방"을 만드는 것은 다양한 샘플에 문서화 된 것처럼 쉽습니다. 채팅의 데이터 구조에 대한 제한된 수의 Firebase 객실
, 내가 이런 걸 사용합니다 :rooms
room1
member_count
members
user1
user2
messages
message1
을하지만 지금은 객실당 참가자의 수에 제한을 만들 생성하고 싶은 말 채팅 당 3 사용자 방.
어떻게 할 수 있습니까? 자신의 문서에서
은 가장 유망한 보았다 한 가지 transactions를 사용했다. 이것이 좋은 방법인지 확인할 수 있습니까? 아니면 잘못된 접근입니까?
이와 비슷한 해결책은 무엇입니까? 이 접근 방식에 대해 언급 할 수 있다면
Firebase countRef = new Firebase("https://mychat.firebaseIO-demo.com/rooms/room1");
countRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData currentData) {
int oldMemberCount = currentData.child("member_count").getValue(Integer.class);
currentData.child("member_count").setValue(oldMemberCount + 1); // try to update member count
return Transaction.success(currentData);
}
@Override
public void onComplete(FirebaseError error, boolean committed, DataSnapshot currentData) {
if (error != null || !commited) {
// rollback value (how? just do nothing?)
}
else {
// transaction has been commited (value has already been saved?)
currentData.child("members").child(CURRENT_USER_UUID).setValue(CURRENT_USER_NAME); // add user to the members list
}
}
});
그것은 좋은 것입니다. 또한 트랜잭션이 실패하면 해당 상황에서 만족할 수 없습니다. 동시에 가입하려는 다른 사용자가 있었는지에 관계없이 사용자는 계속 가입하려고합니다. 그럼 어떡하지? 이 코드를 함수에 넣고 함수를 다시 호출하면 오류가 발생합니다.
편집 :
자동으로 고유 한 ID로 새로운 공간을 만들려면, 하나는 확실히 Firebase
기준에 push()를 사용할 수 있습니다.
하지만 그 방에 구성원을 추가하려면 위에서 설명한 문제가 남아 있습니다. 또 다른 해결책은 가입시 회원 목록에서 사용자의 priority을 설정하는 것입니다. 우선 순위를 현재 타임 스탬프로 설정하면 limit 멤버 목록 콜백을 3 (멤버)으로 할 수 있습니다. 그러나 그것은 우아하고 깨끗한 것처럼 보이지 않습니다.
member_count 값을 읽을 수 없습니까? 3보다 작 으면 'join '이외의'abort '를 사용 하시겠습니까? –
아니요, 두 클라이언트가 동시에 가입을 시도하면 members_count를 4로 설정하고 가입합니다. 그 후에 실제로 5 명의 고객이 방안에있게됩니다. 그리고이 시나리오는 실시간 응용 프로그램에서 매우 그렇습니다. 그렇지 않습니까? – caw
연결하기 전에 수표를 찍은 후 연결 한 후에는 괜찮을 것입니다. Firebase는 실시간으로 30 밀리 초가 아닙니다.그들은 정말로 빠르지 만 당신이 말하는 30 밀리 초 지연을 좋아하지 않습니다. 그런 종류의 서버가 필요하다면 논리를 수행하고 Firebase를 사용하지 않는 서버가 필요합니다. 하지만 작동 할 수있는 한 가지 해결책은 보안 문제를 만드는 것입니다.이 보안 규칙은 'val(). children(). length === 2'인 경우 쓰기를 금지합니다. 그것은 제대로 작동합니다. –