HERE IS THE SOLUTION THAT I USED
I made a query
on my Firestore Database and create a Box around my position.
FirebaseFirestore database = FirebaseFirestore.getInstance();
CollectionReference locals = database.collection("locals");
//I created a box with user LatLng. Every marker inside this box will be loaded
Query markers = locals.whereGreaterThanOrEqualTo("location", new GeoPoint(userLat - 0.5, userLng - 0.5))
.whereLessThanOrEqualTo("location", new GeoPoint(userLat + 0.5, userLng + 0.5));
markers.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()){
String localName = (String) document.get("localName");
GeoPoint location = (GeoPoint) document.get("location");
LatLng localPosition = new LatLng(location.getLatitude(), location.getLongitude());
Marker marker = mMap.addMarker(new MarkerOptions()
.position(localPosition)
.title(localName)
);
}
}
}
});
Here is an example:

Your request will load only markers inside this box.
Why this is very important?
If you have 5000 markers in your database and you have 10.000 daily users, every time a user opens the map he will request 5000 documents to your database. If 10.000 people open the map once a day there will be 50.000.000 requests to documents.
If you have a Blaze plan this will cost you $29.10 daily.
Try to imagine if you have 100.000 users... there will be $299.10 daily.
With my solution you load only documents in a specific area that you can define increasing or decreasing the box.
Hope I helped many users. if someone has a better solution, I'm ready to listen.