Cursors are stateful. This greatly complicates the design of the backend. First, you have to maintain state in some kind of session on the app server. Second, if you have more than one app server, you'll have to share the sessions across them using Redis or Hazelcast or something. Third, cursors have to be closed, which means you have to know when the user is done with the result set. This is impossible to know. The…
> Generally, you have some ordering criteria, for example, product id. In this case, you’ll encode your product id with some reversible algorithm (let’s say hashids). And on receiving a request with the cursor you decode it and generate a query like `WHERE id > :cursor LIMIT 100`.