Firebase одновременная блокировка / разблокировка доступа для записи нескольких устройств - PullRequest
1 голос
/ 16 мая 2019

Я ищу несколько советов о том, как заблокировать / разблокировать доступ на запись Firebase при одновременном доступе с нескольких устройств для Android

Я хотел бы иметь возможность сделать что-то вроде этого:

  • получить доступ на запись и заблокировать
  • запускаемый процесс -> получить некоторые данные из firebase, обработать его
  • запустить процесс -> получить данные из предыдущего запуска, записать некоторые данные в firebase
  • запускаемый процесс -> получить данные из другого запускаемого объекта, получить другие данные, обработать их
  • запускаемый процесс -> записать некоторые данные
  • и т. Д.
  • задача выполнить все синхронные работоспособные, записать кучу данных в firebase
  • разблокировать доступ на запись

Моя первая идея - добавить к тайм-ауту.Запись блокировки может прекратиться в одиночку, если вы не разблокируете ее до того, как предоставите разрешенную сумму, чтобы гарантировать, что никакое устройство не сможет заблокировать доступ.

Я читал о транзакции, но не думаю, что она удовлетворяет моим требованиям.Потому что мне нужен доступ к нескольким путям во время обработки.

У кого-нибудь есть идеи, как реализовать блокировку / разблокировку доступа для записи, который устройство должно получить, прежде чем сможет писать?

Спасибо залюбая идея.

PS: моя работающая синхронная задача уже отлично справляется со своей задачей, я просто смотрю, как заблокировать и разблокировать доступ для записи в firebase, чтобы убедиться, что никакое другое устройство не может повредить данные, пока я их обрабатываю.

Ответы [ 3 ]

1 голос
/ 16 мая 2019

Итак, на самом деле, есть способ. Даг, прежде чем ответить, нет пути, может быть, тебе стоит попытаться открыть свой разум, вместо того, чтобы сразу пойти на быстрый ответ.

Вот как это сделать: - использовать транзакцию - прочитайте запись в нужном патче и заблокируйте нужный патч. Entry - guid + метка времени вашего устройства. - если временная метка <меньше вашей, патч не заблокирован, вы можете взять его, написав свой гид и свою временную метку + время, когда требуется блокировка. - когда транзакция успешна, вы выигрываете и можете делать все, что захотите. - когда закончите, напишите текущую метку времени, чтобы снять блокировку </p>

1 голос
/ 16 мая 2019

Если кому-то это нужно, вот как я это сделал для сборки и получения одной блокировки по заданному пути 3s.- С каждой таблицей (путем) вы можете связать одно tableInfo, которое содержит блокировку для этого пути.- затем приобретите, отпустите и продлите время, если блокировка больше никому не нужна.Вы можете добавить слушателя в другое поле с помощью guid другого устройства, которое пытается получить эту блокировку.И будьте добры выпустить его, а не продлевать время.

fbBase.child(tableInfoChildRef).child(TableInfo.Field.Lock.name).runTransaction(new Transaction.Handler() {
                public Map<String, Object> lock(){
                    Map<String, Object> data = new ArrayMap<>();
                    data.put(TableInfo.Field.Lock.guid, AppGUID.get().toString());
                    data.put(TableInfo.Field.Lock.timestamp, System.currentTimeMillis()+3000);
                    return data;
                }

                @NonNull
                @Override
                public Transaction.Result doTransaction(@NonNull MutableData mutableData) {

                    if(mutableData.getValue() == null) {
                        mutableData.setValue(lock());
                        return Transaction.success(mutableData);
                    }else{
                        Long lockTimestamp = mutableData.child(TableInfo.Field.Lock.timestamp).getValue(Long.class);
                        if(lockTimestamp < System.currentTimeMillis()){
                            mutableData.setValue(lock());
                            return Transaction.success(mutableData);
                        }
                    }
                    return Transaction.abort();
                }

                @Override
                public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
                    if(b) LogDelay.send("WIN");
                    else LogDelay.send("LOSE");
                }
            });
1 голос
/ 16 мая 2019

Ни в базе данных реального времени, ни в Cloud Firestore нет механизма, позволяющего принудительно блокировать всю базу данных или даже ее часть в течение произвольного промежутка времени, пока вы над ней работаете. Нечто подобное просто не будет масштабироваться в реальном мире.

Обе базы данных предоставляют механизм транзакций, который является единственным способом выполнять чтение и запись атомарно и согласованно. Если у вас есть абсолютные требования для какой-либо другой формы блокировки, облачная база данных может оказаться не лучшим вариантом. Либо так, либо вы направляете весь доступ через одну часть промежуточного программного обеспечения, которым вы управляете, что также не будет хорошо масштабироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...