QuickNetwork - A powerful hybrid alternative to ProfileService and DataStore2

Why do you use UpdateAsync without anything? No comparing anything? I suggest using :SetAsync() instead if you’re not using UpdateAsync with no version comparing or anything.

Additionally, how are you handling backups? I can’t find any Ordered DataStore calls inside your modules, so I assume this is just a clone of the main version. Which doesn’t really come in as a hybrid from DataStore2 at all.

Some logging datastore calls later and I find out you’re using the same system as the :SetBackup() method from DS2, just a reminder those aren’t really backups but ok I guess.

Also, should have more info about the getting data thing, there’s nothing in the example you show, I thought it was some :Get() function or something. Only now I noticed it’s literally just do data.index

I also don’t know how to save data, it isn’t automatically saving so I’m not sure? :Save() doesn’t mean to wanna fire.

1 Like

The point of this module using UpdateAsync is not the old data, it respects incoming calls which is vital for session locking.

It fires, you can’t forcefully save data unnecessarily with this module to prevent it from sending another API call unnecessarily. And it won’t automatically save the data without any checks on which I encourage you to explore the source code.

If I ask, have you read the full source code properly? Whenever you call Save, it won’t forcefully save the data without any checks:

To forcefully save data, just pass an argument true.

What? Do you even know what backups are? QuickNetwork allows you to load backup data your self, it doesn’t load it automatically if data fails to load due to the flexibility nature.

DataStore2 these days is now inferior, the use of ordered data stores is extremely redundant and wastes resources, this module saves a backup of your data carefully. I think you have been under the mindset that ordered datastores are the way for backups, no.

Whenever you the data is saved, this module will first check if saving backup data is allowed, if so, it will save the current data to a backup data.

Upon loading data via LoadDataAsync, if that data couldn’t be loaded, an event DataErrorSignal will fire and you can do whatever you want, if you wish to load the backup data, return LoadBackup. Upon loading the backup data, it will be marked as a Backup so the module knows it’s a backup data and thus won’t be saved to the actual data store to prevent overriding the player’s actual data.

Same goes for when data loads but is corrupted, DataCorruptionSignal is fired and you can do whatever you want, if you wish to load the backup data, return LoadBackup but except this time, the backup data won’t be actually marked as Backup and will be saved to the actual data store.

I highly encourage you to read the documentation.

Read the documentation please.

4 Likes

How are you saving backups is my question.

Ordered Datastores pointing is fine for versioning, it is extremely expensive, but DataStore 1.1 is gonna release soon. (Q1 2021, so pretty soon) so it turns these solutions more useless anyhow.

My question is how do you handle backups, as: oh I save it in OrderedDataStores pointers, or oh I save it as a “insert method here”.

Honestly DS2 doesn’t have backups, it’s called versioning, it doesn’t keep backups, it keeps versions of data, so it depends on how you think of it. That’s why you don’t automatically get these backups while using DS2.

I didn’t go for a full walk through the entire thing, I’m asking you stuff to see if I would want to use it.

1 Like

How is this backup data store handled like, what key to do you set it to, etc? Knowing the methods you use to saving data is crucial.

I literally can’t find anything in documentation.

1 Like

The backup data is saved to the key you pass in as the first argument when calling LoadDataAsync in the backup data store.

The documentation is to help you how to use the methods, not explain everything about how this module saves and loads data.

1 Like

Yeah that’s why I was asking ^^

1 Like

Can we get some examples of this?

1 Like

If you don’t want QuickNetwork to warn data store messages such as “Data Saved” or any error messages, you can set Logging to false.

Data:Save() -- will warn if data saves or errors

Settings.Logging = false 

Data:Save() -- will not warn if data saves or errors

No, I mean like the messages :sweat_smile:

Some of them are self explanatory and already explained, what one do you want an explanation for?

I recommend not using strings for setting things make it like profileservice where you can change it by path’s and its value like k,v

saying this

data:Set("key_to_set", 2) -- should be just instead data.key = 2

There is no proper way to detect when a table has changed and QuickNetwork always checks if data has updated before saving it, therefore it provides setter methods to update data.

2 Likes

People have annoyed me for that, but you can use userdatas (aka new proxy(true)), or alternatively really just an empty table that points to another table with NO issue.

Not possible with how QuickNetwork manages a data’s metatables.

Wdym by that? You can also just block certain indexes from being written to, like the indexes from your functions, and internal stuff. It is possible if you were to do it. Just wrap that into your already existing system. I can’t think why it wouldn’t be possible.

No, how data is loaded and managed will be completely broken and there’s no point anyways.

Looks cool, thanks for the module!

I don’t understand the point of this module. This module will become obsolete very soon, with the addition of built-in backups. Also, how do I know if all of your methods work? Has this been used in major games? How often does data loss occur? I don’t think this is any better than DataStore2 or ProfileService. I’ll just stick to ProfileService.

This module has been battle tested thoroughly and knowing if the methods work is a stupid question, test it out your self; obviously they do work.

DataStore2 is now inferior, it just only has a redundant way of saving backups which won’t help in data loss that effectively, you are guaranteed to load with old data instead of the latest because it doesn’t provide session locking and doesn’t handle any edge cases. Not to mention the bloated API and no flexibility.

Profile service is a decent module, with features like session locking but doesn’t provide you any ways to do the following / disadvantages:

  • Know when data is successfully saved or wiped / reset.

  • Handle data corruption / error with flexibility - you can only tell if data has corrupted but cannot decide whether to load backup data or a custom data, or just simply let the module handle it.

  • Far less flexible: you cannot control if you want ProfileService to save data on server shutdown or enable auto saving etc.

  • Doesn’t take extra steps to save / load data with precaution.

This module is a hybrid combination of both with 4x more flexibility and control, easy to use and light weight. Since this module is battle tested, there is no need to worry about data loss, as it saves data a better than both DataStore2 and ProfileService, effectively handles data loss and also minimises API calls than both.

You can also create your own methods on top of existing ones as well.

PS:

This module also provides an easy way to combine data from different data stores or keys all into one, something which is very necessary but something which DataStore2 or ProfileService don’t
provide.

Saying this module will “become obsolete” is highly an subjective and immature statement without any proof or logic behind.

2 Likes

I was talking about Roblox’s plan to provide built-in backups for datastores. It will make this obsolete. And replying with such a rude attitude is immature :wink: .

Of course I know how to test it myself, it appears you did not understand my question. Allow me to explain it like I would to a two year old. How do I know whether it works on a large scale or not? It may work a couple of times while testing, but without large-scale testing, it is impossible to know whether this is a good module or not.

PS.

You answered none of the questions I asked and instead replied in a very rude way. This is a step back if you want success in your module. Maybe instead of ranting on how “stupid” my questions were, you could actually answer them next time. :slightly_smiling_face:

2 Likes