我打算将以前创建的Java Web应用程序迁移到Azure.以前用于log4j应用程序级别日志的应用程序,保存在本地创建的文件中.问题是,Azure角色具有多个实例,我必须收集并聚合这些日志,并确保它们存储在永久存储中而不是虚拟机硬盘中.
日志记录是应用程序的关键组件,但它不能减慢实际工作的速度.我考虑了多种选择,我很好奇最佳实践,考虑安全性,日志一致性和存储时间以及后续处理的性能的最佳解决方案.以下是选项列表:
Appender一起使用以在Azure SQL中存储信息.Appender一起使用以在Azure表存储中存储信息.是否有任何其他方法或针对Java的此问题是否有任何完整的解决方案?考虑到上述标准,上述哪一项最佳?
我有以下问题.
我在IIS 8上托管WCF应用程序,它只接受带有客户端证书的HTTPS请求.此服务接受POST消息,其大小可能不同(从几个字节到1 GB),并且大多数时间是并行接收的.
在以下情况下,客户端获得413 Request实体的响应太大:
可以通过将uploadReadAheadSize值设置为比system.webServer/serverRuntime配置部分中所有并行调用大小的总和更大的值来解决此问题,但这会导致服务器为每个调用分配预读缓冲区的全部内存量,在许多并发调用的情况下,服务器会耗尽内存.
如果使用不同的客户端证书进行调用或上传一个大文件,则我的配置有效.
我已经读过,在IIS 6中,有一个选项可以SSLAlwaysNegoClientCert在配置中设置以修复类似的错误.我已尝试过设置此值的变通方法,但未使用IIS 8.0成功.我也尝试关闭SSL客户端缓存以禁用SSL会话恢复,但这也没有解决我的问题.
什么可能导致413错误?有没有办法在不使用服务器的整个内存的情况下,使用客户端证书启用多个并行上载到同一服务器.
我的问题是我不时想从Java中删除Azure表的内容.该表有数百万行,因此它似乎不是逐个删除所有实体的好方法(因为许多REST API调用).
我试图删除然后再次创建表,但我的代码失败了.
getTableClient().deleteTableIfExists("tablename");
getTableClient().createTableIfNotExists("tablename");
Run Code Online (Sandbox Code Playgroud)
这是我的堆栈跟踪:
com.microsoft.windowsazure.services.table.client.TableServiceException: Conflict
at com.microsoft.windowsazure.services.table.client.TableServiceException.generateTableServiceException(TableServiceException.java:57)
at com.microsoft.windowsazure.services.table.client.TableOperation$2.execute(TableOperation.java:339)
at com.microsoft.windowsazure.services.table.client.TableOperation$2.execute(TableOperation.java:322)
at com.microsoft.windowsazure.services.core.storage.utils.implementation.ExecutionEngine.executeWithRetry(ExecutionEngine.java:110)
at com.microsoft.windowsazure.services.table.client.TableOperation.performInsert(TableOperation.java:374)
at com.microsoft.windowsazure.services.table.client.TableOperation.execute(TableOperation.java:551)
at com.microsoft.windowsazure.services.table.client.CloudTableClient.execute(CloudTableClient.java:638)
at com.microsoft.windowsazure.services.table.client.CloudTableClient.createTable(CloudTableClient.java:173)
at com.microsoft.windowsazure.services.table.client.CloudTableClient.createTableIfNotExists(CloudTableClient.java:251)
at com.microsoft.windowsazure.services.table.client.CloudTableClient.createTableIfNotExists(CloudTableClient.java:197)
Run Code Online (Sandbox Code Playgroud)
我需要在两次通话之间睡一会儿吗?我宁愿不要在这里等待太久,因为我想让这个操作尽可能短,以便其他线程可以在表中再次写入.
或者有一种安全的方法吗?
编辑
是的,我正在寻找一个等效的SQL语句:DELETE FROM tablename;在Azure表中尽可能少的REST API调用.
我目前最好的镜头是:
getTableClient().deleteTableIfExists("tablename");
// TODO: solve problem with new creation!
boolean success = false;
while (!success) {
try {
success = getTableClient().createTableIfNotExists("tablename");
} catch (StorageException e) {
System.err.println("Log table recreation failed retrying in 5 sec");
try {
Thread.sleep(5000);
} catch (InterruptedException ex) …Run Code Online (Sandbox Code Playgroud)