我正在开发一个应该可以在离线和在线模式下工作的iPhone应用程序.
在它的在线模式中,它应该将用户输入的所有信息提供给由GWT/GAE支持的Web服务.在它的离线模式下,它应该在本地存储信息,当连接可用时,将它同步到Web服务.
目前我的计划如下:
问题是 - 我是否朝着正确的方向前进?实现这个的标准模式是什么?也许有人可以指向一个以类似方式工作的开源应用程序?
我对iPhone编码很陌生,很高兴听到任何建议.
谢谢
是否有可能使用某种类型的转换器,允许Sync Framework将字符串"0"/"1"视为false/true的布尔值.根据bool.parse文档,默认情况下不支持它,所以它有解决方法吗?
更多细节,以防有人可以建议不同的方法来解决这个问题:我有一个针对Android的自定义Sync Framework客户端实现,因为它使用SQLite数据库,我无法在表字段上强制执行某些严格的数据类型.我可以拿出约定来指示布尔字段,例如,"Is"前缀,但这将是令人讨厌的.另一件事是SQLite中的布尔值被视为数字类型,因此插入/更新boolean false/true到SQLite数据库会自动将它们转换为0/1而我不想在android端引入一些TRUE/FALSE = 1/0转换.
欢迎任何想法.
[更新]更多详细信息:服务器端包含一些使用Microsoft Sync Framework 4.0 CTP的服务.除了创建范围等之外,没有太多要配置.客户端生成变更集并使用JSON格式将其传输到服务器.变更集来自SQLite数据库(并且SQLite没有除数字0/1之外的任何本机布尔表示),因此在读取数据库时,没有迹象表明即将到来的数据是布尔类型的.字段值作为字符串序列化为JSON对象,具有数值("0"或"1"),因此服务器端在尝试将其解析为bool时失败.
顺便说一句,如果进行单向客户端到服务器同步,可以解决它.我手动将服务器端实体字段类型设置为字节,Sync Framework很好地将其用作"位"数据库类型.此解决方法不适用于服务器到客户端.
我们正在使用PHP和Symfony框架开发应用程序.理想情况下,系统可以在远程服务器上运行,因此可以在任何地方在线使用.但是,也必须有离线可用性.
为此,系统将在远程服务器和本地服务器上运行.默认情况下,客户端将访问本地服务器,并且仅在设施外部在线工作.
因此,我们需要实现数据库同步,以便在本地和远程数据库上进行更改,而无需任何类型的客户端交互.如果可能,它应该是在后台运行的守护进程,同步数据库.主数据库将是本地数据库,因此它将优先考虑任何冲突.
我们还没有决定要使用的数据库系统(我们正在使用Doctrine,因此任何受支持的数据库都会这样做),所以我们真的在寻找具有最适合我们方案的解决方案.
只要不需要客户端交互,解决方案可以是专用的应用程序,无论是否是商业应用程序.
我正在寻找一种软件,该软件将允许我在Linux机器之间的specyfic文件夹中同步文件。我搜索了很多主题,而我发现的是Unison。它看起来不错,但是现在不在开发中,不允许我查看文件更改历史记录。所以问题是-最好的linux文件同步器是什么:
我正在寻找一种方法来将我的数据从MySQL同步到MongoDB.我不想只是复制我的数据,我希望它们永久同步.有谁知道Tungsten Replicator是否能胜任这项工作?我可以看到它复制了数据但是在MySQL数据库中进行更改时会自动复制数据呢?
如果不可能,你会建议任何其他解决方案吗?
我们已经通过PHP Laravel 构建了一个LAMP-stack API 应用程序.这当前使用本地mySQL实例.我们大多在AngularJS中实现了视图.
为了使用Firebase,我们需要在mySQL中的权威商店与Firebase上存在的任何相关内容之间同步数据,尽可能接近实时.这意味着应用程序中非实时且不使用Firebase的其他部分也可以提供最近输入系统的新内容.
我知道Firebase本质上是云中的noSQL数据库.我的问题是 - 如何编写包装器或将我的Firebase的规范版本同步到我的记录数据库中的方法 - mySQL?
更新回答 - 我们的最终决定 - 放弃Firebase作为选项
我们已经决定反对这一点,因为我们可以在同一台服务器上轻松拥有一个socket.io实例,并且与mySQL的延迟极低,这样两者就可以保持同步.当localhost上可以存在资源和端点时,无需浏览Web.它还为我们提供了在没有任何互联网连接的情况下运行我们的应用程序的选项,这对于向大公司销售内部部署设备非常重要.
像Firebase这样的noSQL同步平台实际上只是一个临时存储,可以半实时地提高读/写速度.如果他们试图进入"我们也坚持一切为你"的业务 - 这是一个完全不同的要求,需要更多的承诺.
mySQL和Firebase之间最终一致性的保证对于首先获得正确性更为重要 - 以防止出现问题.此外,RDMS对我们的应用程序至关重要 - 它是在我们的分析/数据映射中攻击大量数据密集问题的唯一方法 - 世界上大多数人仍使用像MySQL这样的RDMS等非常有力的理由.您可以制作那些非常可靠 - 通过Amazon RDS和Google Cloud SQL.
除了扩展Firebase实际为我们解决的实时同步之外没有具体问题,其他开源框架尚未解决.如果他们的JS lib实际上处理了脱机场景(当你开始离线时),我可能已经考虑过了,但它还没有这样做.
所以,YMMV - 但在我们的具体情况下,由于上面给出的原因,我们没有考虑Firebase.
mysql synchronization data-synchronization angularjs firebase
我有一个关于这两个相关的问题火力地堡网络平台的 本地修改数据发送到服务器的同步:
共享Firebase数据库的每个客户端都维护其自己的内部版本的任何活动数据.更新或保存数据时,会将其写入此数据库的本地版本.然后,Firebase客户端会以"尽力而为"的方式将该数据与Firebase服务器以及其他客户端同步.
数据修改方法(set(),
remove()等)可以采用onComplete回调参数:
在与Firebase服务器同步完成后将调用的回调函数.回调将
Error在失败时传递一个对象; 别的null.Run Code Online (Sandbox Code Playgroud)var onComplete = function(error) { if (error) { console.log('Synchronization failed'); } else { console.log('Synchronization succeeded'); } }; fredRef.remove(onComplete);
在上面的示例中,fredRef.remove()回调期望接收哪种错误?
有没有办法区分临时和永久错误?
我们应该如何处理/从这些错误中恢复?
对于临时错误,我们是否需要fredRef.remove()在短时间后再次呼叫,以重试操作?
我意识到每次调用set()并将remove()在onComplete回调中收到单独的同步成功/失败结果.但我正在寻找一种方法来确定整个Firebase客户端的
全局同步状态.
我想使用一个beforeunload事件监听器来警告用户在所有修改过的数据同步到服务器之前他们试图离开页面,我正在寻找一些类似的功能firebase.isAllModifiedDataSynced().像这样的东西:
window.addEventListener('beforeunload', function (event) {
if (!firebase.isAllModifiedDataSynced()) {
event.returnValue = …Run Code Online (Sandbox Code Playgroud) javascript data-synchronization firebase firebase-realtime-database
给定一组M个非同步副本,我们如何找到给定大小N的子集,以最小化在可靠的多播环境中同步其消息状态所需的消息重传次数(即 - 所有副本可靠地接收所有其他副本的消息)?
副本的消息状态由它们各自来自相同D源的消息组成(D> = M).对于每个源,副本具有来自该源的所有消息,直到某些最高序数(即 - FIFO,没有孔,从零开始).因此,副本的消息状态可以表示为序数向量,每个元素对应一个源.或者,如果您愿意,可以将副本的消息状态视为D维空间中的一个点.
假设所有M个副本已经交换了它们的消息状态向量,因此它们都具有所有消息状态的M行×D列的矩阵.因此,鉴于矩阵,现在这纯粹是一个集中的计算问题.
给出最佳答案的蛮力方法是检查所有(M选择N)子集并选择需要同步该子集所需的最小重传次数的子集.问题是这种方法在M中至少具有因子渐近复杂性.
我想知道是否有人知道或者可能会想到一个具有更好的渐近界限的最优算法?
最初,我正在考虑将其作为图论理论解决,其中复制品的消息状态是完全连接图中的顶点,其中边权重是两个端点的消息状态向量之间的曼哈顿距离.然后使用Prim算法跟随Kruskal算法进行min-link凝聚层次聚类,其中我们在任何聚类的大小等于或超过N时停止.
这可以在O(M ^ 2)时间内运行,但我可以构建反例,它不会立即产生最佳答案.例如,为简单起见,D = 1,让M = 7个复制品的序数为{0,2,4,14,15,16,19},N = 5.Kruskal的算法将聚类{14,15,16 ,19}和{0,2,4}然后在最后一步将这两个集群连接在一起.但我们想要的实际答案是将副本与状态{2,4,14,15,16}同步.也许我们可以在第一个合并的集群超过N然后尝试修剪它时停止?但是在这个例子中,我们又回来再次问原始问题,因为我们停止的集群实际上包含了所有M个副本!当然,当D> 1时,这个问题并不是那么简单,它总是(D> = M).
上述方法的另一个问题是,如果算法选择将两个副本群集同步到一个更大的群集中,那么这不仅会影响其他群集与新合并群集之间的距离(例如 - 就像在正常的凝聚层次聚类中一样),也是所有其他集群之间的距离,因为它们都听到并且可以从发送的任何重传中受益.因此,所有群集之间的所有距离都可以在每个合并步骤之后以非常简单的方式改变,如果您允许副本受益于此处接收的消息而不是FIFO,无孔顺序.例如,副本A具有从源D1到序号X的消息.算法选择同步两个副本群集,既不包括A,也需要从X + 5到X + 10的源D1重传消息.最优算法将意识到A可能从这些重传中受益,即使它们超出了他的FIFO,源D1的无孔序数,消息间隙为X + 1到X + 4.
我想到解决它的另一种方式是将其视为几何问题,其中M个复制品的状态代表D维L1空间中的点.然后我们想要找到包含至少N个点的最小"体积"凸包.这实际上可能不是一个好的方法,但几何上自然地考虑它可以捕获所有复制品可以从任何两组复制品同步中受益的想法.它们的大部分距离将缩小到由两个集合状态的合并创建的新对象的表面(而不是顶点!).
编辑 - 我想到的另一种方式来自我给出的例子.对于每个源DX,找到需要最少重传次数的N个副本的子集,以在该源上进行同步.这很容易.那么问题是你必须比较和修改这些D子集以使它们全部覆盖相同的N个副本.这不是一个完全形成的想法,因为每个维度DX中的最小N是全局空间中的局部最小值,可能在错误的区域中作为该维度的全局最优答案.无论如何,这是另一个想法.
EDIT2 - 回到Prim的+ Kruskal算法并忽略每个合并更新所有簇之间的相对距离,当我们发现大小等于或超过N的第一个簇时,最佳答案必须是某个子集那个集群?如果集群的大小等于N,那么我们就完成了.如果簇的大小超过N,那么我们可以做一些像计算簇的质心并选择N个最接近质心的复制品吗?这会产生最佳答案吗?这似乎仍然不正确,因为它没有考虑距离质心的各种距离的"方向性".也就是说,它不区分在D维空间中彼此接近的两个复制品(它应该支持),而不是相对于质心处于彼此"相反"方向的两个复制品.也许我们可以改为查看群集中副本的最小生成树,并以某种方式有效地修剪它以找到保持连接的最小权重子集?
任何想法或相关算法的指针将不胜感激!
我有一个'TODO列表应用程序',目前使用Apollo Client 1.0,Redux和Redux Saga.当我编辑我的TODO列表中的任何项目时,它会立即在各种UI中更新,然后在几秒钟后与服务器同步.此处需要限制,因为否则每次按键都会导致网络请求.当在另一个客户端编辑待办事项并且新数据通过GraphQL订阅到达时,相应的列表项会立即更新,除非它被更改(在这种情况下忽略传入编辑).
我想用Apollo 2.0取代Redux和Redux Saga,因为我目前的应用程序代码非常冗长而且难以调试.在处理我的UI时,我想简单地使用Query/Mutation抽象,并将限制委托给某个apollo-link.
最好的方法是什么?如何在保持本地UI更新的同时为我的项目列表实现限制的双向同步?
有趣的是,这就是Meteor可以通过其定制的数据同步协议开箱即用:-)
我在互联网上寻找有关Pouchdb的各种信息,我喜欢将远程数据库与本地浏览器数据库同步的想法.我想到的第一个问题是它是否在每个设备上存储整个数据库并在每个设备上创建副本?想象一下,我正在创建一个聊天应用程序,所有通信都将使用此应用程序存储在所有设备上.然后,一个用户可以查看其他人的对话.我查看了Pouchdb文档,发现了过滤复制.任何人都可以解释这种同步是如何工作的,以及是否可以仅将数据同步到特定用户?
例:
这是一个远程数据库,例如在云中,保存所有信息.
远程数据库:
/ user/secret informations /
/ Joe /"秘密信息"/
/丹/"秘密信息"/
在这里,我想仅为特定用户同步数据.不要同步整个数据库,只能同步用户特定的数据.
乔的装置
/ user/secret informations /
/ Joe /"秘密信息"/
丹的装置
/ user/secret informations /
/丹/"秘密信息"/
我相信我解释了我的问题.谢谢你的回答.